web-dev-qa-db-fra.com

Quelle est la différence entre la notification à distance et la notification silencieuse dans iOS?

Lorsque je lis Apple Docs , ils mentionnent 3 types de notification: locale, distante et silencieuse.

La notification locale peut être déduite de son nom, qui est envoyé localement par l'application.

Cependant, quelle est la différence des deux autres types?

34
transang

EDIT: Bien que cette réponse soit pleinement applicable, il existe des ajouts (pas de modifications) aux notifications dans iOS 12. Je recommande vivement de regarder - WWDC 2018: Nouveautés des notifications utilisateur et voir ici .

Les principaux changements sont les suivants:

  • notifications de groupe
  • notifications provisoires
  • notifications critiques
  • possibilité d'interagir avec les notifications dans les extensions

Trop de paramètres doivent être correctement définis pour que cela fonctionne. Je vais essayer de les disséquer et de les rendre plus faciles à comprendre.

Globalement, plusieurs choses sont importantes.

  • la différence globale entre un silence et utilisateur notification
  • différents types de utilisateur notifications
  • comment une notification à distance, c'est-à-dire le charge utile, est configurée à partir de votre serveur
  • comment activer les notifications Push et les notifications à distance à partir des modes d'arrière-plan de votre projet
  • comment enregistrer votre jeton pour remote et silent notifications
  • comment demander l'autorisation pour utilisateur notifications
  • activation de l'actualisation de l'application en arrière-plan et des notifications à partir du device
  • qu'est-ce que content-available
  • comprendre que l'iOS est en amont à votre application lorsqu'il s'agit de recevoir une notification à distance
  • que se passe-t-il lorsque le système d'exploitation reçoit des notifications lorsque l'application est terminée par l'utilisateur?
  • Une note sur la fiabilité et l'architecture des APN

Je recommande vivement à tous de regarder les 7 premières minutes de: WWDC 2015: Nouveautés dans les notifications . À partir de là, le présentateur mentionne qu'il existe 2 principaux types de notifications:

Notifications silencieuses

Ils se produisent en arrière-plan, par conséquent, vous ne voyez jamais aucune alerte/badge/son. Les choses sont téléchargées sans vous les connaissez.

iOS 11 bug

Voir ici . Les versions initiales d'iOS 11 étaient boguées pour les notifications silencieuses. Assurez-vous de disposer de la dernière version pour vos tests, sinon cela pourrait ne pas fonctionner


Notifications utilisateur

Comme son nom l'indique, cela a quelque chose à voir avec le utilisateur. En d'autres termes, l'utilisateur verra une alerte/un badge ou entendra un son. Il a 2 types.

Notifications locales

Une notification locale peut être déclenchée de 3 manières différentes:

  • UNLocationNotificationTrigger: Vous voyez une alerte lorsque vous êtes proche d'un magasin Walmart.

  • UNTimeIntervalNotificationTrigger: par exemple Vous voyez une alerte toutes les 10 minutes.

  • UNCalendarNotificationTrigger comme le 1er décembre à 13 h 2017.

Notifications à distance

Ils sont similaires aux notifications locales, mais ils sont déclenchés à partir du serveur, par exemple. un message WhatsApp qui a un champ De (maman) et un champ de corps (je t'aime!).

Quelques notes aléatoires:

Pour recevoir une notification silencieuse ou à distance, vous devez vous inscrire pour un jeton en utilisant:

application.registerForRemoteNotifications() 

???? L'enregistrement ne nécessite PAS l'autorisation de l'utilisateur. Cela rend les notifications silencieuses devenir transparentes. Voir ce moment de la vidéo WWDC

Les notifications silencieuses sont activées par défaut . L'utilisateur n'a pas besoin d'approuver votre - ne donne pas la permission à votre application de les utiliser, et vous pouvez simplement commencer à les utiliser sans lui demander l'autorisation.

de WWDC

Pour pouvoir show badges/alertes/sons, vous devez demander à permission de l'utilisateur:

UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in

    guard error == nil else {
        //Display Error.. Handle Error.. etc..
        return
    }

    if granted {
        //Do stuff here..

        //Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
        application.registerForRemoteNotifications()
    }
    else {
        //Handle user denying permissions..
    }
}

Question: Dois-je demander l'accès une fois pour les notifications locales et une fois pour les notifications distantes?

Non, il suffit d'écrire l'extrait de code ci-dessus pour qu'il demande l'accès pour les deux distant et local.

Passons maintenant à la partie délicate: D


Dois-je activer quelque chose pour recevoir des notifications silencieuses?

  1. Vous devez activer Push Notifications à partir de vos capacités Xcode:

enter image description here

Si vous ne l'activez pas, votre application ne recevra pas de jeton. Et sans jeton, le serveur ne vous reconnaît pas.

  1. Pour pouvoir télécharger des fichiers à partir du background, vous devez activer: notifications à distance à partir des modes d'arrière-plan.

Pour activer backgroundModes , vous pouvez le faire soit en utilisant votre plist ou Xcode possibilités .

La raison pour laquelle vous pouvez le faire de l'une ou l'autre manière est que: plist est plus proche de votre code et est l'ancienne, peut-être qu'il existe pour le support hérité. Les fonctionnalités Xcode constituent le moyen le plus récent et le plus simple.

plist:

enter image description here

L'élément 0 est juste un index , ce n'est pas la clé d'un dictionnaire (quelque chose que vous voyez normalement dans la liste de pliste), UIBackgroundModes est un array de Strings. Les chaînes ne doivent provenir que d'un valeur acceptée du IBackgroundModes Array .

Xcode Capabilities:

Vérifiez le Remote Notification Dans Xcode dans les modes d'arrière-plan comme ci-dessous:

enter image description here

Si vous ne faites rien de ce qui précède, désactivez les notifications avec:

enter image description here

va tuer Notifications locales et distantes


Cependant, si vous do == activez l'actualisation de l'application en arrière-plan à partir des fonctions Plist ou Xcode, alors, même si les notifications sont désactivées pour l'application, vous recevrez toujours notifications silencieuses!

Si l'utilisateur souhaite désactiver les notifications en mode silencieux, il doit désactiver les deux notifications et désactiver l'actualisation de l'application en arrière-plan pour votre application/sur le système. Pour désactiver "l'actualisation de l'application en arrière-plan" sur votre système, vous devez procéder comme suit:

enter image description here

Pourquoi est-ce que je dis tout ça? Pour vous expliquer que paramètres des notifications silencieuses et Push sont différentes pour l'utilisateur et que les restrictions pour leur envoi sont différentes. Pour plus d'informations, voir this moment tiré de la vidéo WWDC. Voir ici à la place (le lien précédent était mort):

Les notifications silencieuses sont activées par défaut.

L'utilisateur n'a pas besoin d'approuver votre ne donne pas la permission à votre application de les utiliser, et vous pouvez simplement commencer à les utiliser sans lui demander l'autorisation.

Mais les notifications silencieuses sont le mécanisme derrière l'actualisation de l'application en arrière-plan.

A tout moment, vous savez que l'utilisateur peut entrer dans les paramètres et les désactiver.

Vous ne pouvez donc pas compter sur leur disponibilité permanente.

Vous ne savez pas si l'utilisateur peut les désactiver et vous ne recevez plus de notification.

Cela signifie également que les notifications silencieuses sont livrées avec le meilleur effort possible.

Cela signifie que lorsque la notification arrive sur le périphérique de l'utilisateur, le système va faire certains choix.

Il va utiliser différents signaux de l'appareil et du comportement de l'utilisateur, tels que l'alimentation ou l'heure du jour, pour décider du moment opportun pour envoyer la notification et lancer votre application.

Il peut essayer de réaliser des économies de batterie ou de tenter de s'adapter au comportement de l'utilisateur et de rendre le contenu disponible lorsque l'utilisateur est plus susceptible de l'utiliser.

Voir aussi ici .

CAVEAT: Même si vous désactivez l'actualisation de l'arrière-plan de l'application et des notifications d'autorisation, vous pouvez toujours recevoir des notifications en mode silencieux si votre application se trouve dans FOREGROUND. Si votre application est en arrière-plan, elle ne sera pas livrée.


Dois-je activer quelque chose pour recevoir des notifications à distance?

Vous devez simplement activer Push Notifications à partir de vos capacités Xcode:

enter image description here

Si vous ne l'activez pas, votre application ne recevra pas de jeton. Et sans jeton, le serveur ne vous reconnaît pas.


Curious ... Pouvez-vous me dire à quoi ma charge utile devrait ressembler?

Je vous recommande fortement de voir Apple§ documentation . C'est très clair.

Merci, mais pouvez-vous simplement me dire les parties importantes?

euhhmm ... OK, mais juste pour que vous sachiez que c'est du lien que je viens de dire:

Pour Notifications silencieuses , il existe deux critères:

  • Le dictionnaire aps du payload doit inclure la clé content-available Avec une valeur de 1.
  • La charge aps dictionnaire ne doit pas contenir les clés alert, sound ou badge.

Un exemple de charge utile ressemblerait à ceci:

{
    "aps" : {
        "content-available" : 1
    },
    "acme1" : "bar",
    "acme2" : 42
}

acme1, acme2 ou juste quelques données personnalisées! Mais pour la touche aps, vous DEVEZ suivre la structure d’Apple, sinon elle ne fonctionnera pas map et vous ne pourrez pas lire les données correctement.

Pour Remote Notifications :

Vous avez besoin d'une clé alert à l'intérieur de votre aps.

Par exemple:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

Il y a aussi un troisième option dont je parlerai plus loin dans la réponse.

En ce qui concerne les clés de dictionnaire aps et alert corrigées, reportez-vous à celles-ci documentation Apple .

OK, compris. Qu'est-ce que content-available?

Très simple. Il s'agit simplement d'un drapeau qui indique à votre application que vous devez vous réveiller et télécharger quelque chose car j'ai du contenu disponible pour le téléchargement! Pour plus d'informations, voir ceci moment exact .

Par défaut, l’indicateur content-available N’est pas inclus, c’est-à-dire que les notifications que vous envoyez ne sera pas déclenchent application(_:didReceiveRemoteNotification:fetchCompletionHandler:) ou font quelque chose dans votre application. Cela montrerait simplement la notification. Si vous voulez réactiver l'application (pour faire quelque chose en arrière-plan), vous devez inclure content-available Et la définir sur 1.

§: Si vous utilisez Firebase , la structure de votre charge utile et vos clés peuvent être légèrement différentes. Par exemple, la clé content-available Est remplacée par content_available. Pour plus d'informations, voir documentation Firebase et aussi ici .


Je sais que vous m'avez dit que je ne peux télécharger quelque chose dans mon application que lorsque j'utilise des notifications silencieuses, mais existe-t-il un moyen de réveiller mon application en arrière-plan ET de télécharger quelque chose pour les notifications distantes? ?

Oui, mais comme dans le cas de la notification silencieuse, vous devez également définir le drapeau content-available Sur 1 afin que le système sache se réveiller et télécharger quelque chose. Sinon, il suffirait d'afficher une alerte/un badge/du son sans rien télécharger.

NOTES IMPORTANTES:

  • Si votre application ne comporte que des notifications en mode silencieux, activez simplement les "notifications Push" + "notifications à distance" à partir des fonctionnalités et définissez content-available Sur 1 Pour chaque charge utile.
  • Si votre application ne comporte que des notifications à distance, activez simplement les "notifications Push" à partir des fonctionnalités. Il n'y a rien à faire pour le content-available.
  • Toutefois, si vous souhaitez que vos notifications affichent une alerte/un badge/un son et téléchargent quelque chose en arrière-plan, vous devez activer les "notifications à distance" et les "notifications Push" + définir content-available Sur 1.

(TROISIÈME OPTION)

{
    "aps" : {
        "content-available" : 1 
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
        "acme1" : "bar",
        "acme2" : 42
}

Ce moment de la vidéo WWDC mentionne le ????


Je suis confus au sujet des notifications distantes. Je pensais que chaque fois que je recevais une notification, mon application devenait active en arrière-plan et téléchargeait quelque chose. Pouvez-vous expliquer?

par exemple. à ce moment là:

enter image description here

  • Votre iPhone vient de recevoir une notification à distance avec un corps "sans expéditeur". Pour recevoir cela, WhatsApp pas doit être exécuté en arrière-plan, c.-à-d. Que vous n'avez pas besoin d'activer "Notifications à distance" à partir de BackgroundModes. Vous recevrez toujours la notification même si votre application était forcée de quitter ou d'être suspendue, car le processus est géré par le système d'exploitation, et non l'application WhatsApp . Cependant, si vous voulez pouvoir télécharger le message ou son image/vidéo sur WhatsApp (afin que, dès que votre utilisateur ouvre WhatsApp, la vidéo attend son utilisateur), votre application doit devenir active. . Pour ce faire, vous avez besoin de content-available : 1 Et implémentez application(_:didReceiveRemoteNotification:fetchCompletionHandler:).

  • De même, si vous désactivez les données cellulaires pour une application, vous recevrez toujours ses notifications. Cependant, en appuyant sur cette notification, l'utilisateur non pourra faire toute requête réseau pour cette application. Ils ne pourraient que ouvrir l'application.

  • Ou comme dans un autre scénario similaire, si le serveur/point d'accès auquel vous êtes connecté a un accès restreint pour, par exemple, WhatsApp, il vous permettrait quand même de recevoir les notifications d'APN. Cependant, en appuyant sur cette notification, l'utilisateur non pourra faire toute requête réseau pour cette application. Ils ne pourraient que ouvrir l'application.

CAVEAT: Si l'application a été forcée de quitter par l'utilisateur, alors que vous recevez la notification pour les raisons mentionnées ci-dessus, vous ne pouvez rien faire pour sortir l'application. de son état terminé automatiquement (même si vous aviez content-available défini sur 1). Aucune de vos méthodes de délégué ne serait touchée. Le utilisateur doit ouvrir l'application et vos méthodes de délégué ne seront alors atteintes.


Note sur la fiabilité et l'architecture des APN: Bien que les notifications soient très utilisées pour transmettre le contenu réel à l'application, elles ne sont PAS un peu conçues pour livrer = contenu de l'application. Ils sont plutôt conçus pour notifier l'utilisateur que "quelque chose de nouveau est arrivé (un message de 2b ou une petite image de 50kb, ou une image de 10 Mo ou une vidéo de 2 Go). Ouvrez l'application si Au fait, en voici un petit morceau (le message lui-même if il peut tenir, le titre de l'image ou une vignette affichée dans la notification, un titre de la vidéo ou une vignette affichée dans la vidéo ". Pour en savoir plus, voir repli" meilleur effort "iOS APNS . Pour me répéter, vous ne téléchargez jamais la pièce jointe de 40 Mo envoyée dans le courrier électronique. Vous envoyez juste assez (une vue miniature de la pièce jointe) pour que l'utilisateur soit informé des nouveautés et puisse décider s'il doit ou non ouvrir l'application pour plus d'informations. vous envoyez réellement l'image/la vidéo via la notification Push.

141
Honey

La notification Push indiquera à l'utilisateur qu'il reçoit une notification (affichage du menu contextuel de notification, par exemple). La notification silencieuse sera mise à jour, mais l'utilisateur ne sera pas averti à ce sujet. Dans tous les cas, vous pouvez effectuer des actions en cas de notification silencieuse, comme s'il s'agissait d'une notification Push. La seule différence est que l'utilisateur ne recevra pas de notification avec la notification contextuelle.

Avec notification Push: enter image description here

Avec notification silencieuse: enter image description here

La différence est dans la charge utile:

Notification push:

     aps {
       content-available: 1
       alert: {...}
     }

Notification silencieuse:

    aps {
      content-available: 0
      alert: {...}
    }

Et vous devez définir dans capacités le mode d'arrière-plan que vous choisissez.

6
Juan Curti

La notification Push silencieuse parvient à l'appareil. L'utilisateur ne sait rien de la notification, mais son application reçoit la notification et l'application aura le temps de télécharger du nouveau contenu et de le présenter à l'utilisateur, quel que soit l'état de l'application (en cours d'exécution ou non). fonctionnement)

La méthode de notification Push à distance est appelée uniquement lorsque votre application est en cours d'exécution. Si l'application est suspendue ou n'est pas en cours d'exécution, le système se réveille ou démarre votre application et la place à l'arrière-plan avant d'appeler la méthode. Cette méthode est destinée à afficher le contenu mis à jour à l'utilisateur. Lorsque cette méthode est appelée, votre application dispose de 30 secondes maximum de temps d'horloge murale pour effectuer l'opération de téléchargement et appeler le bloc de gestionnaire d'achèvement spécifié. Si le gestionnaire n'est pas appelé à temps, votre application sera suspendue.

Pour plus de détails techniques, vous pouvez passer par ces liens:

Notifications Apple

Notifications silencieuses

0
Bidisha Pyne