web-dev-qa-db-fra.com

iOS10 UNNotificationServiceExtension non appelée

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:

  • J'ai mon application prête à fonctionner avec les notifications Push et le bon profil d'approvisionnement
  • J'ai ajouté une nouvelle cible à mon application, une extension du service de notification.
  • Implémenter mon propre code (cela n'a pas vraiment d'importance car il n'entre même pas dans la nouvelle classe)
  • De plus, je devais définir un profil de provisioning pour cette extension. J'en ai simplement utilisé un avec un caractère générique. Je ne vois pas de documentation spécifiant si la cible de l'extension doit activer la fonctionnalité de notifications Push. un, au moment où je viens d'utiliser un caractère générique prov, de toute façon il correspond (il doit correspondre) au profil que j'utilise dans la cible de l'application, et la fonctionnalité de notifications Push est activée uniquement pour la cible de l'application.
  • J'ai ajouté UNNotificationExtensionCategory et NSExtensionPointIdentifier. Également, j'envoie la catégorie dans le cadre de la charge utile Push à partir du serveur.

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

12
Rodrigo.C

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 

5
Rodrigo.C

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.

37
basvk

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:

  1. Définissez votre point d'arrêt dans l'extension
  2. Sélectionnez Debug/Attach to Process par PID ou par nom
  3. Entrez le nom de la cible de l'extension
  4. Déclencher la notification Push
7

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:

  1. Cliquez sur votre projet d'application à gauche.
  2. Cliquez sur votre cible principale de l'application.
  3. Choisissez Général.
  4. Sous Fichiers binaires incorporés, assurez-vous que votre extension est répertoriée. Sinon, ajoutez-la.
2
Jonny

Il semble que votre plist mélange 2 plists . Il y a 2 extensions en jeu: 

  1. Notification Content Extension - responsable de l'affichage du contenu via un contrôleur de vue
  2. Notification Service Extension - chargé d'extraire le contenu en arrière-plan avant l'affichage de la notification

Voici le plist pour Notification Content Extension target: 

 enter image description here

Voici le plist pour Notification Service Extension target: 

 r

2
Or Arbel

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

0
Jon Whitmore

Assurez-vous que vous avez défini la configuration «Aucune». Regardez la capture d'écran. Avec d'autres paramètres, didReceive ne fonctionne pas.

Configuration

0

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.

0
Simon Bengtsson

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 .

0
AnitaAgrawal