didReceiveRemoteNotification ne fonctionne pas en arrière-plan

Je travaille sur une grosse application avec un énorme morceau de code hérité. Actuellement – il y a une implémentation pour:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

Le problème est qu'il n'est appelé que lorsque l'application est au premier plan OU lorsque l'user appuie sur la notification pendant que l'application est en arrière-plan. J'ai essayé de mettre en œuvre:

 - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 

Mais l'application se comporte de la même manière. Dans tous les cas, cette méthode n'est pas appelée lorsque l'application est en arrière-plan. Quel pourrait être le problème?

Implémentation de didReceiveRemoteNotification et de didReceiveRemoteNotification:fetchCompletionHandler est la méthode correcte, mais vous devez également effectuer les opérations suivantes:

Assurez-vous de vous save pour les notifications à distance, voir la documentation ici :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; return YES; } 

Assurez-vous également de modifier Info.plist et cochez les Info.plist "Activer les modes d'arrière-plan" et "Notifications à distance":

entrez la description de l'image ici

En outre, vous devez append "content-available":1 à votre charge de notification push, sinon l'application ne sera pas réveillée si elle est en arrière-plan (voir la documentation ici ):

Pour qu'une notification push triggers une opération de téléchargement, la charge utile de la notification doit inclure la key disponible avec sa valeur définie sur 1. Lorsque cette key est présente, le système éveille l'application en arrière-plan (ou la met en arrière-plan). appelle l'application du délégué de l'application: didReceiveRemoteNotification: fetchCompletionHandler: méthode. Votre implémentation de cette méthode devrait download le contenu pertinent et l'intégrer dans votre application

Donc, la charge utile devrait au less ressembler à ceci:

 { aps = { "content-available" : 1, sound : "" }; } 
  1. Inscrivez-vous pour une notification push dans le délégué de l'application.
  2. Ajoutez le mode d'arrière-plan dans les fonctionnalités de l'application.
  3. Ajoutez "content-available" = "1" lors de l'envoi de la notification push (si vous utilisez firebase, remplacez "content-available" = "1" par "content_available" = "true" lors de l'envoi de la notification push côté server).

J'ai eu le même problème. La bannière de notification est apparue, mais -application: didReceiveRemoteNotification: fetchCompletionHandler: la méthode n'a pas été appelée. La solution pour moi qui a fonctionné était d'append l'implémentation de – application: didReceiveRemoteNotification: méthode et forward appel à -application: didReceiveRemoteNotification: fetchCompletionHandler ::

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in } }