J'implémente la nouvelle extension iOS10 pour utiliser les notifications riches. J'essaie de le tester sur les notifications Push mais ne fonctionne pas, je viens de recevoir une simple notification et je ne passe pas par l'extension.
J'ai fait tout ce qui est spécifié dans les sites officiels et à d'autres endroits:
Comme je l'ai dit, je reçois la notification mais ne passe jamais par l'extension. Je vois comment le système d'exploitation essaie de charger l'extension mais génère ensuite une erreur sans description pertinente pour identifier le problème:
Dec 31 21:00:00 iPhone SpringBoard(libextension.dylib)[51] <Notice>: calling plugIn beginUsing:
Dec 31 21:00:57 iPhone pkd[86] <Notice>: assigning plug-in com.test.app.NotificationWithAttachmentExtension(1.0) to plugin sandbox
Dec 31 21:03:57 iPhone pkd[86] <Notice>: enabling pid=51 for plug-in com.test.app.NotificationWithAttachmentExtension(1.0) 38BB5FF1-2597-42E0-B950-169DBFA80573 /private/var/containers/Bundle/Application/A8C47706-C0EC-4FB1-ABA7-0118372F6900/testapp.app/PlugIns/NotificationWithAttachmentExtension.appex
Dec 31 21:00:53 iPhone SpringBoard(PlugInKit)[51] <Notice>: plugin com.test.app.NotificationWithAttachmentExtension interrupted
Dec 31 21:03:56 iPhone SpringBoard(PlugInKit)[51] <Notice>: Hub connection error Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.test.app.NotificationWithAttachmentExtension" UserInfo={NSDebugDescription=connection to service named com.test.app.NotificationWithAttachmentExtension}
Jun 29 13:33:36 iPhone SpringBoard(libextension.dylib)[51] <Notice>: PlugInKit error in beginUsing:
Jun 17 23:33:04 iPhone SpringBoard(libextension.dylib)[51] <Notice>: killing invalid plugIn
Dec 31 21:00:00 iPhone SpringBoard(UserNotificationsServer)[51] <Error>: Extension error whilst trying to modify Push notification F502-9B36: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.test.app.NotificationWithAttachmentExtension" UserInfo={NSDebugDescription=connection to service named com.test.app.NotificationWithAttachmentExtension}
Dec 31 21:00:00 iPhone SpringBoard(UserNotificationsServer)[51] <Notice>: [com.test.app] Saving notification F502-9B36
Dec 31 21:00:00 iPhone SpringBoard(libextension.dylib)[51] <Notice>: completed calling plugIn beginUsing: for pid: 0
Extension pertinente .plist:
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>UNNotificationExtensionCategory</key>
<string>attachmentCategory</string>
<key>UNNotificationExtensionInitialContentSizeRatio</key>
<real>1</real>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.Apple.usernotifications.service</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
</dict>
Qu'est-ce qui ne va pas ou manque?
Merci d'avance
Enfin, cela fonctionne correctement et c’est ce dont je me souviens de ce numéro.
1) N'utilisez pas d'appareils dotés de la version bêta iOS10, car l'un des problèmes que j'ai rencontrés était dû au fait que j'utilisais une version bêta.
2) seule l'application nécessite les droits d'accès APNS, elle n'est pas requise pour la configuration utilisée pour l'extension.
3) J'utilisais un profil de provisioning correspondant à l'id de l'extension (pas de caractère générique), de toute façon, je ne peux pas confirmer s'il fonctionne correctement ou non avec un caractère générique.
4) NSExtensionAttributes ne sont pas nécessaires , utilisez simplement NSExtensionPointIdentifier et NSExtensionPrincipalClass pour l'extension .plist. Sauf si vous utilisez votre propre mise en page
5) Cela fonctionne même en utilisant les méthodes d'enregistrement de jeton iOS 9.
6) N'oubliez pas la valeur de contenu mutable dans la charge utile figurant dans la notification Push. Il s'agit de la seule valeur obligatoire dont le serveur a besoin pour passer par l'extension.
Je pense que cela couvre tous les problèmes que j'avais
L'astuce consiste également à vérifier votre cible de déploiement pour l'extension. Le mien était réglé sur 10.2
alors que le périphérique sur lequel je testais utilisait (encore) la version 10.1
Après avoir modifié la cible de déploiement en 10.0
, l’instance UNNotificationServiceExtension
a été appelée à la perfection.
Et si vous avez tout fait correctement, n'oubliez pas de le joindre au processus.
Après avoir exécuté l'application contenant l'extension:
Je suis venu ici la deuxième fois. La première fois, cette réponse m'a aidé, la deuxième fois, ça ne l'a pas été. Après beaucoup de jurons (internes), j'ai découvert que j'avais supprimé accidentellement l'extension des fichiers binaires incorporés de ma cible principale. Lorsque j'ajoute l'extension, mon extension sera appelée à nouveau.
Alors vérifiez ceci:
Il semble que votre plist mélange 2 plists . Il y a 2 extensions en jeu:
Voici le plist pour Notification Content Extension
target:
Voici le plist pour Notification Service Extension
target:
Après avoir essayé nombre des correctifs possibles déjà donnés sans succès, je me suis rendu compte qu'un cadre avait été ajouté par erreur à notre cible d'extension plutôt qu'à la cible de test unitaire.
La suppression de la structure et le ciblage 10.2 ont permis à mon extension d’être appelée une nouvelle fois.
Si vous êtes curieux de savoir quel framework, pour quelque raison que ce soit, vous pouvez le trouver ici: https://github.com/plu/JPSimulatorHacks
Assurez-vous que vous avez défini la configuration «Aucune». Regardez la capture d'écran. Avec d'autres paramètres, didReceive
ne fonctionne pas.
Mon problème était double. La première était probablement que j'avais défini la propriété Info.plist
NSExtensionPrincipalClass sur bundle.identifier.NotificationService
au lieu de ProductModuleName.NotificationService
. Le nom de module est le nom par défaut, mais j'avais modifié à tort l'identifiant lors du débogage de certains autres éléments liés à différents schémas et différentes cibles.
Le deuxième problème est que j'ai testé en exécutant la cible du service de notification. Pour moi, cela fonctionnait beaucoup mieux lors de l'exécution de la cible de l'application. J'ai vu d'autres personnes recommander d'utiliser la cible du service de notification pour activer le débogage. Mais cela fonctionne également lors de l'exécution de la cible de l'application. Vous devrez cependant connecter manuellement le débogueur à votre service de notification.
La façon dont j'ai découvert ce qui précède a été de créer un nouveau projet de test avec un code minimal. Avec le recul, je recommande définitivement cette approche au lieu d’essayer les différentes solutions trouvées sur stackoverflow, etc.
Si vous utilisez Firebase, essayez de modifier la charge comme suit:
{
“aps” : {
“category” : “SECRET”,
“mutable_content” : true,
“alert” : {
“title” : “Secret Message!”,
“body” : “(Encrypted)”
},
},
“ENCRYPTED_DATA” : “Salted__·öîQÊ$UDì_¶Ù∞è Ω^¬%gq∞NÿÒQùw”
}
Le champ mutable_content est mappé sur le champ mutable-content sur les APN . Pour plus de détails, consultez ceci link .