Reputation: 1657
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;
}
Upvotes: 1
Views: 760
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