web-dev-qa-db-fra.com

le push silencieux iOS11 (extraction en arrière-plan, didReceiveRemoteNotification) ne fonctionne plus

J'espérais que la version iOS11 résoudrait le problème de Push silencieux, qui figurait dans les dernières versions bêta et la version GM d'iOS.

Actuellement, j'ai du mal à comprendre pourquoi je ne reçois aucun message Push silencieux, ce qui devrait en fait réactiver mon application pour effectuer certaines tâches nécessaires en arrière-plan.

Dans iOS 10, je viens d'utiliser la fonction de récupération en arrière-plan et d'implémenter le code de réveil dans mon AppDelegate, comme le code ci-dessous.

Sous iOS 11, le code d'enregistrement fonctionne toujours correctement et mon back-end fournit également la notification Push aux serveurs Apples DEV (bac à sable) ainsi qu'aux serveurs PROD (version de production). Malheureusement, la fonction func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) n'est jamais appelée par les notifications Push silencieuses.

Ai-je vraiment manqué quelque chose ici pour iOS 11?


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  // .. some variables here ...

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

       // register silent Push notification in backend
       application.registerForRemoteNotifications()

       // ... some code here ... 


       // Set Background Fetch Intervall for background services / terminated app
       UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)

       // ... some code here ... 

       return true
   }

   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
       let tokenParts = deviceToken.map { data -> String in
           return String(format: "%02.2hhx", data)
       }
       let token = tokenParts.joined()
       logger.log.debug("Device Token: \(token)")

       let realm = RealmController()
       let user = realm.getLoggedInUserObject()

       // Send Push token to server
       if let user = user {
           let email = user.email!

           let serverController = ServerController.serverController
           serverController.sendPushToken(token: token, email: email) { status in
               if status == 201 {
                // ... some code here ...
               } else {
               // ... some code here ...
               }
           }
       }
   }
   func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
       logger.log.debug(error)
   }
   func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
       logger.log.debug(userInfo)

       let aps = userInfo["aps"] as! [String: AnyObject]
       if aps["content-available"] as? Int == 1 {
          // .... some silent Push tasks here ....
       }
   }
}
8
AlexWoe89

Final UPDATE 2017-10-31

Apple vient d'avoir sa version officielle (Halloween) d'iOS 11.1

 Apple Release Software Update 31st of October

UPDATE 2017-10-09

Apple a publié iOS11.1 beta 2 aujourd'hui. Encore une fois, ils ont mentionné dans leurs notes de publication la note suivante:

Notifications Problèmes résolus 

Les notifications Push silencieuses sont traitées plus fréquemment. (33278611)

Je vais tester à nouveau cette version bêta 2 et mettre à jour cette réponse pour votre information.

UPDATE - Testing -> Après quelques tests avec différents scénarios, ce bogue semble avoir été corrigé dans la dernière version iOS11.1 beta 2. Maintenant, nous ne pouvons qu'attendre la sortie officielle. Sur certains forums, ils supposent qu'Apple sortira iOS11.1 fin octobre. 


Ancien post

J'ai passé beaucoup de temps la semaine dernière à chercher une réponse à ce problème. Après avoir lu les notes de publication Apple (y compris les fonctions obsolètes, modifiées et nouvelles), j’ai testé la situation suivante:

J'ai ajouté la fonction vide à ma AppDelegateet maintenant le Push silencieux fonctionne à nouveau à la fois au premier plan et également en arrière-plan:

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        logger.log.debug("Perform Fetch with completion handler TEST")
    }

Je ne suis pas sûr que cette "solution de contournement" soit liée au problème, que la fonction function application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) suivante ne soit pas appelée dans iOS11.

Néanmoins, vous pouvez essayer et me faire des commentaires si vous identifiez le même comportement.

MISE À JOUR 2017-09-25 

Le mode silencieux fonctionne maintenant dans mon cas en avant-plan et en arrière-plan, mais pas si l'application est suspendue de l'utilisateur ou du système d'exploitation. Donc, ce problème est toujours ouvert et non corrigé - toute aide appréciée! Pour plus d'informations, consultez également ce fil: Les appels silencieux ne sont pas livrés à l'application sur iOS 11


UPDATE 2017-10-05

Apple a publié iOS11.1 beta il y a quelques jours. Ils ont mentionné dans leurs notes de publication les éléments suivants:

Notifications Problèmes résolus
Les notifications Push silencieuses sont traitées plus fréquemment. (33278611)

Certains développeurs disent que le problème est résolu avec cette version bêta, d'autres disent qu'il est toujours présent dans certaines circonstances. À présent, il serait intéressant que Apple lance iOS11.1 pour ses clients. 

5
AlexWoe89

Ce que vous rencontrez est en réalité un comportement bien documenté plutôt qu'un bogue. 

La documentation d'Apple dit: "Le système considère les notifications silencieuses comme des priorités faibles. Vous pouvez les utiliser pour actualiser le contenu de votre application, mais le système ne garantit pas leur livraison. peut être limité si le nombre total devient excessif. Le nombre réel de notifications silencieuses autorisées par le système dépend des conditions actuelles, mais n'essayez pas d'envoyer plus de deux ou trois notifications silencieuses par heure. "

En résumé, il n'est pas garanti que la notification silencieuse réveille votre application. Pourquoi? Plus l'application en arrière-plan de l'appareil de l'utilisateur est réactivée, plus la consommation de la batterie est élevée.

Selon la déclaration d'IBM, "avec l'avènement d'iOS 11, Apple a introduit des modifications dans la manière dont il traite certains types de messages Push. Cela a été fait pour améliorer la durée de vie de la batterie, affecter votre application. " Vous pouvez trouver plus de détails ici .

0
Yunlong Wang