Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling didReceiveRemoteNotification when app is launching for the first time

Tags:

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.

like image 235
Sulaiman Majeed Avatar asked Feb 19 '13 22:02

Sulaiman Majeed


People also ask

What is notification service extension?

Android Notification Service Extension. Setup the optional NotificationServiceExtension class in your app to receive data in the background with or without displaying a notification.


1 Answers

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.

like image 100
Eran Avatar answered Oct 12 '22 23:10

Eran