J'ai remarqué que sur iOS 11 bêta 2, les notifications silencieuses ne sont pas livrées au application:didReceiveRemoteNotification:fetchCompletionHandler
quel que soit l'état de l'application (arrière-plan / premier plan).
J'ai implémenté la UIApplicationDelegete
méthode application:didReceiveRemoteNotification:fetchCompletionHandler
et j'envoie le push silencieux suivant
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
mais la méthode déléguée n'est pas appelée sur iOS 11.
Cela fonctionne bien sur les autres versions d'iOS et la section de documentation Configurer une notification silencieuse ne mentionne pas que quoi que ce soit d'autre doit être fait.
Est-ce un bogue dans iOS 11 ou ai-je manqué quelque chose de nouveau dans iOS 11?
Veuillez noter que je ne parle pas ou n'utilise pas le UserNotification
framework qui ne devrait pas être nécessaire pour envoyer des push silencieux.
Voici un exemple de projet qui illustre le problème (vous devrez définir votre propre identifiant de bundle)
Lorsque vous exécutez l'exemple de projet et envoyez une charge utile ci-dessus à l'application, vous pouvez utiliser la console macOS pour voir que le push est correctement transmis à l'appareil mais pas à l'application.
MISE À JOUR 10.08
Il semble que le comportement soit aléatoire. Parfois, après le redémarrage de l'appareil, la charge utile est livrée correctement mais elle cesse de fonctionner après un certain temps.
Comme vous pouvez le voir sur la capture d'écran suivante, le push marqué comme 1 est envoyé uniquement à l'appareil et le push 2 (après le redémarrage de l'appareil) est également livré à l'application.
MISE À JOUR 14.08 - iOS 11 Bêta 6
Toujours le même comportement. Une autre chose qui est censée fonctionner mais qui ne fonctionne pas est la suivante. Lorsque le schéma de l'application est défini sur «Attendre le lancement de l'exécutable», un push silencieux est censé réveiller l'application et la démarrer en arrière-plan.
MISE À JOUR 21.08 - iOS 11 Bêta 7
Toujours le même comportement et pas les mises à jour d'Apple dans le rapport de bogue.
MISE À JOUR 29.08 - iOS 11 Bêta 8
Toujours le même problème. Les étapes à reproduire que j'utilise maintenant sont les suivantes:
- Dans le schéma de projet Xcode, sélectionnez "Attendre le lancement de l'exécutable"
- Ajouter un point d'arrêt dans le
didReceiveRemoteNotification: fetchCompletionHandler
- Démarrez l'application sur l'appareil
- Envoyez la poussée silencieuse ci-dessus
Attendu : l'application passe de l'état suspendu à l'arrière-plan et didReceiveRemoteNotification: fetchCompletionHandler
est appelée
Réel : rien ne se passe
MISE À JOUR 06.09 - iOS 11 Bêta 10
J'ai toujours le même comportement de buggy. Le ticket d'Apple a été mis à jour avec la réponse suivante:
Relations avec les développeurs Apple 6 septembre 2017, 22:42 Le service technique a fourni les commentaires suivants concernant ce problème:
Nous avons pu exécuter l'exemple d'application et tester le comportement. Nous n'avons vu aucun problème lorsque nous avons testé cela comme décrit.
Les poussées ne sont pas garanties d'arriver à l'application lorsqu'elle s'exécute en arrière-plan, et les journaux ici indiquent que nous ne pensons pas que l'application est suffisamment utilisée pour la lancer.
Nous nous voyons livrer des poussées de temps en temps lorsque les conditions sont bonnes.
Nous pensons que cela se comporte correctement.
Mise à jour 11.09
Mon rapport de bogue Apple a été fermé et marqué comme doublon 33278611
dont reste ouvert
MISE À JOUR 13.09 - iOS 11 GM
Grâce aux commentaires de kam800 (voir ci-dessous), j'ai fait plus de tests et suis venu avec ces observations:
Il semble y avoir un nouveau démon dans iOS 11 dasd DuetActivitySchedulerDaemon
qui rejette complètement le push de données ou retarde la livraison de push de données:
Livraison reportée
Journaux de la console
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Problèmes de livraison différée
- Lorsque la livraison push de données est reportée et que l'application est lancée, la poussée de données n'est livrée que lorsque la date de livraison est atteinte, ce qui peut être plusieurs minutes dans le futur. Cela va complètement à l'encontre de l'objectif d'utiliser les poussées de données pour garder le contenu de la nouvelle application prêt pour le prochain lancement. Je cite ici encore une fois la documentation d'Apple:
"Les notifications silencieuses améliorent l'expérience utilisateur en vous aidant à maintenir votre application à jour, même lorsqu'elle n'est pas en cours d'exécution."
- Lorsque deux poussées de données sont envoyées à une application suspendue, elles sont reportées par iOS 11 au lieu de réveiller l'application directement. Lorsque le délai de livraison est atteint, seule la dernière poussée de données est livrée! Les push précédents sont perdus et ne sont pas livrés via la méthode déléguée, ce qui entraîne une perte de données.
Livraison annulée
Journaux de la console
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Problèmes de livraison annulés
Eh bien dans ce cas, la poussée de données est complètement perdue et jamais livrée sur iOS 11 alors qu'elle était correctement livrée sur iOS 10.
MISE À JOUR 19.09 - iOS 11 GM
J'ai également remarqué que lorsque l'application est au premier plan et que la notification n'est pas envoyée à l'application, je vois les journaux suivants dans la console:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
"content-available": 1
et que l'application est au premier plan, le rappel ne sera pas déclenché.