web-dev-qa-db-fra.com

Pourquoi didReceiveRemoteNotification n'est-il pas appelé, mais didReceiveRemoteNotification: fetchCompletionHandler est appelé lorsque mon application est au premier plan?

Si je remplace

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    println("hey)
}

J'ai réussi à faire appeler la méthode avec l'application au premier plan lorsque j'envoie une notification Push.

Si je remplace

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    println("hey")
}

Je ne reçois aucun appel à la méthode lors de l'envoi d'une notification avec l'application au premier plan. Pourquoi le premier fonctionne-t-il, mais pas le second lorsque l'application est au premier plan?

Notez que je n’en implémente qu’un à la fois. Pas les deux en même temps.

12
Adam Johns

Vous devez utiliser la version de rappel sauf si vous devez prendre en charge ios <7 (date de son introduction). Comme vous utilisez Swift, je suppose que ce n'est pas le cas.

L'ancienne méthode retourne à ios3 et est obsolète dans tous les noms sauf name:

Implémentez la méthode application:didReceiveRemoteNotification:fetchCompletionHandler: au lieu de celle-ci chaque fois que cela est possible. Si votre délégué implémente les deux méthodes, l'objet app appelle la méthode application:didReceiveRemoteNotification:fetchCompletionHandler:.

L'ancienne version donnera également des résultats différents selon que l'application est en direct (avant-plan ou arrière-plan) ou qu'elle démarre à froid. Dans ce dernier cas, il ne sera pas appelé et vous devrez intercepter la variable launchOptions sur didFinishLaunchingWithOptions pour obtenir l'infoDict:

Si l'application ne s'exécute pas lorsqu'une notification distante arrive, la méthode démarre l'application et fournit les informations appropriées dans le dictionnaire des options de lancement. L'application n'appelle pas cette méthode pour gérer cette notification à distance.

Utilisez la version de rappel. Cela fonctionne pour tous les cas. Vous n'êtes pas obligé d'utiliser le gestionnaire d'achèvement/bloc, auquel cas l’effet est le même (enfin, plus cohérent avec la méthode la plus récente).

mettre à jour  

désolé, Apple dit que vous do devez appeler le bloc d'achèvement "dès que possible" - vous avez 30 secondes pour le faire avant que le système d'exploitation ne vous abandonne. Cela pourrait être la source de votre avertissement. 

Dès que vous avez fini de traiter la notification, vous devez appeler le bloc dans le paramètre du gestionnaire, sans quoi votre application sera fermée. Votre application dispose de 30 secondes maximum de temps d'horloge murale pour traiter la notification et appeler le bloc de gestionnaire d'achèvement spécifié. En pratique, vous devez appeler le bloc gestionnaire dès que vous avez terminé de traiter la notification. 

Alors appelez le bloc d'achèvement: 

        completionHandler(UIBackgroundFetchResult.NoData)

J'utilise cette méthode without en appelant ce bloc d'achèvement et je n'ai rencontré aucun problème, mais je vais en ajouter un maintenant, par sécurité. Apple suggère que si vous ne le faites pas, votre application ne sera pas mise au premier plan, mais je n'ai pas vu cela dans la pratique.

15
foundry

Avez-vous enregistré au moins une UIUserNotificationType avec UIApplication:registerUserNotificationSettings:?

Si vous ne vous inscrivez pas pour un badge, un son ou une alerte, vous ne pouvez recevoir que des notifications en mode silencieux, qui sont uniquement livrées avec un FetchCompletionHandler.

0
user1055568