web-dev-qa-db-fra.com

Réception de notifications push en arrière-plan

Je sais que cela est couvert dans de nombreux endroits, mais je ne peux pas le comprendre. J'utilise Urban Airship pour les notifications Push. Tout semble aller bien sauf que lorsque mon application est en arrière-plan - didReceiveRemoteNotification n'est pas appelé. Cela fonctionne quand au premier plan - je suis capable de traiter correctement les messages. Et je peux accéder aux messages à partir des options de lancement si le message est tapé à partir du centre de notifications. Mais en arrière-plan, un message qu'il envoie - iOS affiche l'alerte - didReceiveRemoteNotification n'est pas appelé. Lorsque je tape sur l'icône de mon application (pas depuis le centre de notification), l'application apparaît au premier plan et je n'ai aucune idée que la notification est présente. Des idées?

33
Brandon

Depuis le guide de programmation APNS:

Examinons les scénarios possibles lorsque le fonctionnement délivre une notification locale ou une notification distante pour une application.

La notification est envoyée lorsque l'application n'est pas en cours d'exécution au premier plan. Dans ce cas, le système présente la notification, affiche une alerte, badge une icône, peut-être émet un son.

À la suite de la notification présentée, l'utilisateur appuie sur le bouton d'action de l'alerte ou sur (ou clique) sur l'icône de l'application. Si le bouton d'action est tapé (sur un appareil exécutant iOS), le système lance l'application et l'application appelle l'application de son délégué: didFinishLaunchingWithOptions: méthode (si implémentée); il transmet la charge utile de notification (pour les notifications distantes) ou l'objet de notification locale (pour les notifications locales).

Si l'icône de l'application est tapée sur un appareil exécutant iOS, l'application appelle la même méthode, mais ne fournit aucune information sur la notification.

Je pense que la dernière phrase décrit votre cas et explique pourquoi votre demande ne reçoit aucune information sur la notification.

18
Eran

application:didReceiveRemoteNotification: n'appellera en arrière-plan que lorsque vous aurez ajouté content-available clé avec valeur 1 dans la charge utile de notification. Dans le cas du dirigeable urbain, vous pouvez envoyer Test Push sous l'onglet Paramètres. Exemple de charge utile pour les notifications push:

{
  "aps": {
    "alert": "aaaa",
    "badge": "+1",
    "content-available": "1"
  },
  "device_tokens": [
    "86BA71E361B849E8312A7B943BA6B26A74AB436381CF3FEE3CD9EB436A12A292"
  ]
}

Apple l'a clairement mentionné dans sa documentation ....

Pour qu'une notification Push déclenche une opération de téléchargement, la charge utile de la notification doit inclure la clé de contenu disponible avec sa valeur définie sur 1. Lorsque cette clé est présente, le système réveille l'application en arrière-plan (ou la lance en arrière-plan) et appelle l'application du délégué d'application: didReceiveRemoteNotification: fetchCompletionHandler: method. Votre implémentation de cette méthode doit télécharger le contenu pertinent et l'intégrer dans votre application. https://developer.Apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

38

didReceiveRemoteNotification appelle UNIQUEMENT si l'application au premier plan ou si l'application vient d'être lancée ou est achetée de l'arrière-plan au premier plan

lien dans Apple et certains question

6
CReaTuS

Méthode didFinishLaunchingWithOptions: (NSDictionary *) launchOptions paramètre launchOptions l'une des clés de dictionnaire est UIApplicationLaunchOptionsRemoteNotificationKey qui contient les informations de notification Push pressées.

Vous pouvez pousser les informations reçues après l'initialisation du contrôleur racine principal de la visite. Je l'enregistre dans une propriété, puis le pousse après l'initialisation de la vue.

if (launchOptions) {
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
        self.notificationToMakeAction = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    }
}
0