Shahbaz Akram
Shahbaz Akram

Reputation: 1657

App crash when open from Kill state through Push notification Objective C iOS

My app working fine when app is in background and open it by clicking on Push Notification. But if I terminate app and open it through push notification then app crash. I also integrate Crashlytics. Here is attached photo & code. App crash only in one type of notification.It is not data parsing issue.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  //[self showAlert];
                              }
                          }];




// Branch Intigration
    Branch *branch = [Branch getInstance];

//    if is debug
//    [[Branch getInstance] setDebug];


    [branch initSessionWithLaunchOptions:launchOptions andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) {
        if (!error && params) {
            DecisionController * mainVC = [[DecisionController alloc] init];
            [mainVC viewDidLoad];
            // params are the deep linked params associated with the link that the user clicked -> was re-directed to this app
            // params will be empty if no data found
            // ... insert custom logic here ...
            NSString * non_branch_link  = [params objectForKey:@"+clicked_branch_link"];
            if ([[params objectForKey:@"+clicked_branch_link"] boolValue]) {
                NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
                [nc postNotificationName:@"DeepLinkNotification" object:self userInfo:params];
            }
            NSLog(@"params: %@", params.description);
        }
    }];

    // MAGICAL RECORD Intigration
    [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"EmergencMeDatabase.sqlite"];
//    [Fabric with:@[[branch class]]];
    NSLog(@"magical record path to SQLite base %@", [NSPersistentStore MR_defaultLocalStoreUrl]);
    [Fabric with:@[[Crashlytics class]]];

    [SharedRenderer setValue:@"NO" key:isForRedar];
    [[NSUserDefaults standardUserDefaults] setFloat:0 forKey:@"lastnotificationminute"];
    [[FBSDKApplicationDelegate sharedInstance] application:application
                             didFinishLaunchingWithOptions:launchOptions];
    [MPNotificationView registerNibNameOrClass:@"CustomNotificationView"
                        forNotificationsOfType:@"Custom"];
    [self registerForRemoteNotifications];
    [SharedRenderer sharedInstance].retryCount = 0;
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"generatenotification"];
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"FirstSubscribe"];
    mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
                                               bundle: nil];
    if (launchOptions[UIApplicationLaunchOptionsLocationKey]) {

        [self startLocationManager:@""];
    }
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [SharedRenderer setValue:@"0" key:@"alldatafetched"];
        [SharedRenderer setValue:@"" key:@"currentchannel"];
        NSMutableArray* alerts = [[NSMutableArray alloc] init];
        NSData* alertsData=[NSKeyedArchiver archivedDataWithRootObject:alerts];
        [[NSUserDefaults standardUserDefaults] setObject:alertsData forKey:@"nonreasonalerts"];
        NSMutableArray* receivedAlerts = [[NSMutableArray alloc] init];
        NSData* receivedAlertsData=[NSKeyedArchiver archivedDataWithRootObject:receivedAlerts];
        [[NSUserDefaults standardUserDefaults] setObject:receivedAlertsData forKey:@"receivedalerts"];
        NSMutableArray* myAlerts = [[NSMutableArray alloc] init];
        NSData* myAlertsData=[NSKeyedArchiver archivedDataWithRootObject:myAlerts];
        [[NSUserDefaults standardUserDefaults] setObject:myAlertsData forKey:@"myalerts"];
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"OB"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    if (![[SharedRenderer getValueFor:@"isLogin"] boolValue])
    {
        navigationController = [mainStoryboard instantiateViewControllerWithIdentifier:@"loginVC"];
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"showhomealert"];
    }
    else
    {
        if ([[SharedRenderer getValueFor:@"family_id"] isEqualToString:@""] || [[SharedRenderer getValueFor:@"alldatafetched"] isEqualToString:@"0"])
        {
            navigationController = [mainStoryboard instantiateViewControllerWithIdentifier:@"Smarticestep1"];
        }
        else
        {
            navigationController = [mainStoryboard instantiateViewControllerWithIdentifier:@"homenav"];
            [self activatedeacAlertTimer];
            [self activatePendingAlertTimer];
            [self checkFor_AlertDeactivation];
            [self fetchInvitationCount];
            // Mark by Mian:
            //            [self updatePSAlertTable];
        }
    }
    [self.window setRootViewController: navigationController];
    [self.window makeKeyAndVisible];
    LeftMenuViewController *leftMenu = (LeftMenuViewController*)[mainStoryboard
                                                                 instantiateViewControllerWithIdentifier: @"LeftMenuViewController"];
    RightMenuViewController *rightMenu = (RightMenuViewController*)[mainStoryboard
                                                                    instantiateViewControllerWithIdentifier: @"RightMenuViewController"];
    [SlideNavigationController sharedInstance].rightMenu = rightMenu;
    [SlideNavigationController sharedInstance].leftMenu = leftMenu;
    [SlideNavigationController sharedInstance].menuRevealAnimationDuration = .4;

    // Creating a custom bar button for right menu
    UIButton *button  = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
    [button setImage:[UIImage imageNamed:@"gear"] forState:UIControlStateNormal];
    [button addTarget:[SlideNavigationController sharedInstance] action:@selector(toggleRightMenu) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    [SlideNavigationController sharedInstance].rightBarButtonItem = rightBarButtonItem;
    [[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerDidClose object:nil queue:nil usingBlock:^(NSNotification *note)
     {
         //         NSString *menu = note.userInfo[@"menu"];
     }];

    [[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerDidOpen object:nil queue:nil usingBlock:^(NSNotification *note)
     {
         //         NSString *menu = note.userInfo[@"menu"];
     }];

    [[NSNotificationCenter defaultCenter] addObserverForName:SlideNavigationControllerDidReveal object:nil queue:nil usingBlock:^(NSNotification *note)
     {
         //         NSString *menu = note.userInfo[@"menu"];
     }];
    [self ConnectPusher];
    if ([[SharedRenderer getValueFor:@"isLogin"] boolValue]){
        [self checkFor_AlertDeactivation];
        [self removePastAlert];
        [self deactivateAlert];
        [self goOnline_Offline:@"1"];
    }
    [self showAlert:launchOptions];
    return YES;
}

enter image description here

Upvotes: 1

Views: 760

Answers (1)

Shehata Gamal
Shehata Gamal

Reputation: 100541

The issue is that you get the notification that opens the app from launchOptions of didFinishLaunchingWithOptions method and deliver to the same function that handles it when app is opened and perform a push / present that makes the app crash as windows's root view controller is not yet set , so delay that until app it being active

Upvotes: 2

Related Questions