Push Notification -didFinishLaunchingWithOptions

Lorsque j'envoie une notification push et que mon application est ouverte ou en arrière-plan et que je clique sur la notification push, mon application redirige vers PushMessagesVc viewController ( comme prévu )

J'utilise le code ci-dessous pour ceci:

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; PushMessagesVc *pvc = [mainstoryboard instantiateViewControllerWithIdentifier:@"PushMessagesVc"]; [self.window.rootViewController presentViewController:pvc animated:YES completion:NULL]; } 

Il n'y a pas de problème dans le code / scénario ci-dessus mais si l'application est fermée et que je clique sur une notification push, l'application ne redirige pas mon PushMessagesVc viewController dans ce cas et l'application rest sur l'écran principal.

Pour le deuxième scénario, j'utilise le code suivant:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { sleep(1); [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNone)]; [UIApplication sharedApplication].applicationIconBadgeNumber = 1; NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]; NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; if(apsInfo) { UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; PushMessagesVc* pvc = [mainstoryboard instantiateViewControllerWithIdentifier:@"PushMessagesVc"]; [self.window.rootViewController presentViewController:pvc animated:YES completion:NULL]; return YES; } return YES; } 

Mais dans ce cas, le PushMessagesVc n'apparaît pas.

Puisque vous voulez seulement présenter un viewController lorsque vous recevez une notification push, vous pouvez essayer d'utiliser NSNotificationCenter pour vos besoins:

Partie 1: Configurer une class ( dans votre cas, le rootViewController ) pour écouter / répondre à un NSNotification

Supposons que MainMenuViewController est le rootViewController de votre navigationController .
Configurez cette class pour écouter une NSNotification :

 - (void)viewDidLoad { //... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentMyViewOnPushNotification) name:@"HAS_PUSH_NOTIFICATION" object:nil]; } -(void)presentMyViewOnPushNotification { //The following code is no longer in AppDelegate //it should be in the rootViewController class (or wherever you want) UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; PushMessagesVc *pvc = [mainstoryboard instantiateViewControllerWithIdentifier:@"PushMessagesVc"]; [self presentViewController:pvc animated:YES completion:nil]; //either presentViewController (above) or pushViewController (below) //[self.navigationController pushViewController:pvc animated:YES]; } 

Partie 2: Post-notification ( possible à partir de n'importe où dans votre code )

Dans votre cas, les methods AppDelegate.m devraient ressembler à ceci :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //firstly, don't sleep the thread, it's pointless //sleep(1); //remove this line if (launchOptions) { //launchOptions is not nil NSDictionary *userInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; if (apsInfo) { //apsInfo is not nil [self performSelector:@selector(postNotificationToPresentPushMessagesVC) withObject:nil afterDelay:1]; } } return YES; } -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { //this method can be done using the notification as well [self postNotificationToPresentPushMessagesVC]; } -(void)postNotificationToPresentPushMessagesVC { [[NSNotificationCenter defaultCenter] postNotificationName:@"HAS_PUSH_NOTIFICATION" object:nil]; } 

PS: Je n'ai pas encore fait ça pour mes projets mais ça marche et c'est la meilleure façon de faire ça ( pour l'instant )

Swift 2.0 pour l'état 'non fonctionnel' (notification locale et à distance)

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Handle notification if (launchOptions != nil) { // For local Notification if let localNotificationInfo = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification { if let something = localNotificationInfo.userInfo!["yourKey"] as? Ssortingng { self.window!.rootViewController = UINavigationController(rootViewController: YourController(yourMember: something)) } } else // For remote Notification if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as! [NSObject : AnyObject]? { if let something = remoteNotification["yourKey"] as? Ssortingng { self.window!.rootViewController = UINavigationController(rootViewController: YourController(yourMember: something)) } } } return true 

}

Swift 3 Pour get le dictionary de notification push dans didFinishLaunchingWithOptions lorsque l'application est kill et que la notification push est reçue et que l'user clique dessus

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if let userInfo = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [Ssortingng: AnyObject] { if let aps1 = userInfo["aps"] as? NSDictionary { print(aps1) } } return true } 

Push Le dictionary de notification s'affichera en alerte.

Version rapide:

  if let localNotification: UILocalNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification { //launchOptions is not nil self.application(application, didReceiveLocalNotification: localNotification) }