I have implemented my didReceiveRemoteNotification method. It works and displays a view controller with the notification data which is passed through. This only works when the app was already in the foreground or if it was running in the background. However, when the app is not running and the user clicks a notification, the app launches, but it appears as if no notification has been received. The notification is not written into the text file and the viewcontroller is not being pushed.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { if ( application.applicationState == UIApplicationStateActive) { NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; NSString *alertMsg = @""; NSString *badge = @""; NSString *sound = @""; NSString *custom = @""; if( [apsInfo objectForKey:@"alert"] != NULL) { alertMsg = [apsInfo objectForKey:@"alert"]; } if( [apsInfo objectForKey:@"badge"] != NULL) { badge = [apsInfo objectForKey:@"badge"]; } if( [apsInfo objectForKey:@"sound"] != NULL) { sound = [apsInfo objectForKey:@"sound"]; } if( [userInfo objectForKey:@"Type"] != NULL) { custom = [userInfo objectForKey:@"Type"]; } // Set your appending text. NSString *textToAdd = [NSString stringWithFormat:@":%@", alertMsg]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory]; NSString *fileContents = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil]; NSString *textToFile; if (fileContents == NULL) { textToFile = alertMsg; } // Here you append new text to the existing one if (fileContents != NULL) { textToFile = [fileContents stringByAppendingString:textToAdd]; } // Here you save the updated text to that file paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); documentsDirectory = [paths objectAtIndex:0]; fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory]; NSString *content = textToFile; [content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil]; NSArray *fileData = [textToFile componentsSeparatedByString:@":"]; NSMutableArray *tableDataFromFile; tableDataFromFile = [[NSMutableArray alloc] init]; int i = 0; for (i = 1; i < [fileData count]; i++) { [tableDataFromFile addObject:fileData[i]]; } NotificationViewController *vc = [[NotificationViewController alloc] initWithNibName:@"NotificationViewController" bundle:nil]; vc.tableData = tableDataFromFile; UIViewController *root = self.mainNavController.topViewController; NSArray *vcs = [NSArray arrayWithObjects:root, vc, nil]; [self.mainNavController setViewControllers:vcs animated:YES]; } // app was already in the foreground else { while (done == FALSE) { } NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; NSString *alertMsg = @""; NSString *badge = @""; NSString *sound = @""; NSString *custom = @""; if( [apsInfo objectForKey:@"alert"] != NULL) { alertMsg = [apsInfo objectForKey:@"alert"]; } if( [apsInfo objectForKey:@"badge"] != NULL) { badge = [apsInfo objectForKey:@"badge"]; } if( [apsInfo objectForKey:@"sound"] != NULL) { sound = [apsInfo objectForKey:@"sound"]; } if( [userInfo objectForKey:@"Type"] != NULL) { custom = [userInfo objectForKey:@"Type"]; } // Set your appending text. NSString *textToAdd = [NSString stringWithFormat:@":%@", alertMsg]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory]; NSString *fileContents = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil]; NSString *textToFile; if (fileContents == NULL) { textToFile = alertMsg; } // Here you append new text to the existing one if (fileContents != NULL) { textToFile = [fileContents stringByAppendingString:textToAdd]; } // Here you save the updated text to that file paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); documentsDirectory = [paths objectAtIndex:0]; fileName = [NSString stringWithFormat:@"%@/AccountNotifications.txt", documentsDirectory]; NSString *content = textToFile; [content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil]; NSArray *fileData = [textToFile componentsSeparatedByString:@":"]; NSMutableArray *tableDataFromFile; tableDataFromFile = [[NSMutableArray alloc] init]; int i = 0; for (i = 1; i < [fileData count]; i++) { [tableDataFromFile addObject:fileData[i]]; } NotificationViewController *vc = [[NotificationViewController alloc] initWithNibName:@"NotificationViewController" bundle:nil]; vc.tableData = tableDataFromFile; UIViewController *root = self.mainNavController.topViewController; NSArray *vcs = [NSArray arrayWithObjects:root, vc, nil]; [self.mainNavController setViewControllers:vcs animated:YES]; } // app was just brought from background to foreground }
Could someone please help me solve this problem? The boolean done is set to true once the didFinishLaunchingWithOptions is completed. I just want the notificationviewcontroller to open and display the notification if a notification is pressed while the app is not running at all.
Android Notification Service Extension. Setup the optional NotificationServiceExtension class in your app to receive data in the background with or without displaying a notification.
You should add something like this to your code :
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; //Accept push notification when app is not open if (remoteNotif) { [self handleRemoteNotification:application userInfo:remoteNotif]; return YES; } return YES; }
You can move the logic from didReceiveRemoteNotification
to some common function and call that function from both places. This will only work if the user open the app by tapping the notification. If the user opens the app by tapping the app icon, the notification data won't reach the app.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With