Skip Navigation

Add the event-handler skeleton manually

The application-delegate object
UIApplicationDelegate
manages the
iOS
app life cycle using events. You can decide how to implement the life cycle of events; the steps below provide an example that is based loosely on the
Apple
Breadcrumbs sample app (with differences in declarations and other key areas). Several of the sample apps included in the SDK also demonstrate the event handling lifecycle.
  1. Specify the entitlement ID (
    GDApplicationID
    ) and entitlement version (
    GDApplicationVersion
    ) in the
    Info.plist
    file. See Using an entitlement ID and version to uniquely identify a BlackBerry Dynamics app.
  2. Import
    GDiOS.h
    and implement a skeleton
    GDiOSDelegate
    protocol. The following examples for
    Objective-C
    and
    Swift
    rely on a boolean variable named
    started
    . An alternative approach is to declare the variable in your project's
    .m
    file.
    Objective-C
    :
    // AppDelegate.h #import <UIKit/UIKit.h> #import <GD/GDiOS.h> @interface AppDelegate : UIResponder <UIApplicationDelegate, GDiOSDelegate> { BOOL started; } @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) GDiOS *good; - (void)onAuthorized:(GDAppEvent *)anEvent; - (void)onNotAuthorized:(GDAppEvent *)anEvent; @end
    Swift
    :
    class AppDelegate : UIResponder , UIApplicationDelegate, GDiOSDelegate { var window: UIWindow? var good: GDiOS? var started: Bool = false }
  3. Use
    GDAppEvent
    to process events. Move the application launch code from
    didFinishLaunchingWithOptions
    to the
    GDAppEvent
    handler method.
    Objective-C
    :
    // AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.good = [GDiOS sharedInstance]; _good.delegate = self; started = NO; //Show the BlackBerry Authentication UI. [_good authorize]; return YES; } #pragma mark BlackBerry Dynamics Delegate Method - (void)handleEvent:(GDAppEvent *)anEvent { /* Called from _good when events occur, such as system startup. */ switch (anEvent.type) { case GDAppEventAuthorized: { [self onAuthorized:anEvent]; break; } case GDAppEventNotAuthorized: { [self onNotAuthorized:anEvent]; break; } case GDAppEventRemoteSettingsUpdate: { // handle app config changes break; } case GDAppEventPolicyUpdate: { // handle app policy changes break; } case GDAppEventServicesUpdate: { // handle services changes break; } case GDAppEventEntitlementsUpdate: { // handle entitlements changes break ; } default: NSLog(@"Unhandled Event"); break; } }
    Swift
    :
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { //Call BlackBerry Dynamics to authorise the app self.good = GDiOS.sharedInstance() self.good!.delegate = self self.started = false // Show the Good Authentication UI. self.good!.authorize() return true } func handle(_ anEvent: GDAppEvent) { switch anEvent.type { case .authorized: onAuthorized(anEvent: anEvent) break case .notAuthorized: self.onNotAuthorized(anEvent: anEvent) break case .remoteSettingsUpdate: if started { let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "ShareViewController") as! ShareViewController self.window?.rootViewController = newViewController newViewController.refreshUI() } break case .servicesUpdate: //A change to services-related configuration. break case .policyUpdate: if started { NotificationCenter.default.post(name: NSNotification.Name(rawValue: "AppPolicyUpdated"), object: nil); } break default: print("handleEvent \(anEvent.message)") } }
  4. Special-case the
    onNotAuthorized
    events. Verify that the app can handle authorization errors or functionality like remote wipe, a lockout, or blocking events. Implement these events in the
    onNotAuthorized
    function.
    Objective-C
    :
    - (void)onNotAuthorized:(GDAppEvent *)anEvent { /* Handle the BlackBerry Libraries not authorized event. */ switch (anEvent.code) { case GDErrorActivationFailed: case GDErrorProvisioningFailed: case GDErrorPushConnectionTimeout: case GDErrorSecurityError: case GDErrorAppDenied: case GDErrorBlocked: case GDErrorWiped: case GDErrorRemoteLockout: case GDErrorPasswordChangeRequired: { // A condition has occurred denying authorization, an application may wish to log these events NSLog(@"onNotAuthorized %@", anEvent.message); break; } case GDErrorIdleLockout: { // idle lockout is benign & informational break; } default: NSAssert(false, @"Unhandled not authorized event"); break; } }
    Swift
    :
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func onNotAuthorized(anEvent:GDAppEvent ) { /* Handle the Good Libraries not authorized event. */ switch anEvent.code { case .errorActivationFailed: break case .errorProvisioningFailed: break case .errorPushConnectionTimeout: break case .errorSecurityError: break case .errorAppDenied: break case .errorAppVersionNotEntitled: break case .errorBlocked: break case .errorWiped: break case .errorRemoteLockout: break case .errorPasswordChangeRequired: // an condition has occured denying authorization, an application may wish to log these events print("onNotAuthorized \(anEvent.message)") case .errorIdleLockout: // idle lockout is benign & informational break default: assert(false, "Unhandled not authorized event"); } }
  5. On authorization, start the app. Initialize and start the UI with the
    onAuthorized
    function. The
    GDErrorNone
    event is returned by the
    BlackBerry Dynamics Runtime
    whenever a container is opened and no error occurs.
    Objective-C
    :
    - (void)onAuthorized:(GDAppEvent *)anEvent { /* Handle the BlackBerry Libraries authorized event. */ switch (anEvent.code) { case GDErrorNone: { // started was declared in first step. if (!started) { // launch application UI here started = YES; } break; } default: NSAssert(false, @"Authorized startup with an error"); break; } }
    Swift
    :
    func onAuthorized(anEvent:GDAppEvent ) { /* Handle the Good Libraries authorized event. */ switch anEvent.code { case .errorNone: if !self.started { //Show the User UI self.started = true UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tabBarController") } default: assert(false, "Authorized startup with an error") break } }