Notifications de données IOS avec FCM

J'utilise FCM (firebase cloud messaging) pour envoyer des notifications de données "personnalisées" à une application IOS. D'après ce que je comprends, nous utilisons des messages de notification lorsque vous voulez que FCM gère l'affichage d'une notification au nom de votre application. Et nous utilisons des messages de données lorsque vous souhaitez uniquement traiter les messages dans votre application. C'est par design.

Le problème auquel je suis confronté est que ce jeton Device / InstandID est propre à l'application installée et non à l'user connecté à l'application. Donc, pour résoudre ce problème, j'envoie l'label d'user prévue dans datatables afin qu'elle devienne un message de données. Étant donné que l'application traite les notifications de données, la fonction de callback didReceiveRemoteNotification () est déclenchée uniquement lorsque l'application est ouverte et que la notification est uniquement affichée et non instantanément lorsqu'elle est envoyée.

Ma question est que je peux envoyer un message de notification de données personnalisé et le faire apparaître instantanément, même lorsque l'application est fermée.

Voici la charge utile que j'envoie à la FCM:

{ registeration_ids : [<id_1>, <id_2>], data : { title : message_title, body : message_body, intended_user : message_user } } 

Dans android FirebaseMessagingService.onMessageReceived() est invoqué même si l'application est en arrière-plan mais dans ios didReceiveRemoteNotification() n'est invoqué que lorsque l'application est lancée, donc aucun message d'arrière-plan n'apparaîtra si vous envoyez un message de données.

J'ai remarqué que la notification arrivera quand l'application est forcée de fermer dans le cas où la priorité de notification est élevée.

 { "notification": { "body" : "This week's edition is now available.", "title": "Portugal vs. Denmark", "text": "5 to 1", "content_available": 1 }, "data" : { "volume" : "3.21.15", "contents" : "http://www.news-magazine.com/world-week/21659772" }, "to" : "fqUk65A1kTE:APA91bG5...", // or set topic like "/topics/test" "priority" : "high" } 

Pour les applications clientes iOS, les priorités normales et élevées sont analogues aux niveaux de priorité APN 5 et 10.

Dans la documentation iOS, il est possible que les notifications avec priorité par défaut ne soient pas envoyées.

apns-priority: La priorité de la notification. Spécifiez l'une des valeurs suivantes:

10-Envoyer le message push immédiatement. Les notifications avec cette priorité doivent triggersr une alerte, un son ou un badge sur le périphérique cible. C'est une erreur d'utiliser cette priorité pour une notification push contenant uniquement la key disponible dans le contenu.

5-Envoyer le message push à un moment qui prend en count les considérations d'alimentation de l'appareil. Les notifications avec cette priorité peuvent être groupées et livrées en rafales. Ils sont étranglés et, dans certains cas, ne sont pas livrés. Si vous omettez cet en-tête, le server APN définit la priorité à 10.

Mise à jour 1:

La notification ci-dessus est envoyée via FCM api et elle a été reçue alors que l'application a été supprimée. Après avoir appuyé sur la notification sur l'appareil, voici ce qui apparaît dans le journal de l'appareil après le démarrage de l'application:

 ...didReceiveRemoteNotification: [gcm.message_id: 0:1468481012881485%e1d60a46e1d60a46, volume: 3.21.15, aps: { alert = { body = "This week\U2019s edition is now available."; title = "Portugal vs. Denmark"; }; }, contents: http://www.news-magazine.com/world-week/21659772][; 

Notez que la partie de données est également contenue dans le message reçu.

Mise à jour 2:

Plusieurs users sur un seul appareil ou un user avec plusieurs appareils.

Du côté server, vous devez vous assurer qu'un fcm_id unique peut être atsortingbué à un seul user. Cela signifie qu'un appareil est assigné à un user, ainsi un seul user sera averti par appareil.

En outre, un user peut avoir plusieurs fcm_ids, ce qui signifie que l'user peut avoir plus de périphériques et être connecté.

Lorsque l'user_2 se connecte au même périphérique que l'user_1, fcm_id doit être détaché de l'user_1 et associé à l'user_2. De cette manière, seul l'user actuellement connecté recevra le message.

Essayez de définir content_available sur true.

De la documentation fcm:

Remarque: Si vous souhaitez envoyer des messages composés uniquement de valeurs-keys personnalisées à un appareil iOS lorsque l'application est en arrière-plan, définissez des paires key-valeur personnalisées dans la key de données et définissez content_available sur true.

 { registeration_ids : [<id_1>, <id_2>], content_available: true, data : { title : message_title, body : message_body, intended_user : message_user } } 

D'après ce que je comprends jusqu'ici, il n'y a aucun moyen de résoudre ce problème correctement du côté de l'ios. Il fonctionne parfaitement du côté Android car l'application est réveillée dans tous les états (premier plan, background & fermé).

Vous avez deux types de messages que vous pouvez envoyer:

Un message de notification qui est affiché et géré directement par le operating system.

Un message de données géré par l'application.

Si vous ajoutez une balise personnalisée, elle devient un message de données et devra être traitée par l'application. Vous pouvez append une balise content_available dans le message de données pour informer l'application du message, mais le problème est que le message de données est uniquement transmis à l'application dans ios si l'application est mise au premier plan (ouverte) ou en arrière-plan ( minimisé). Le message de données ne sera pas remis à l'application si l'user a "forcé la fermeture" de l'application (même si les notifications d'arrière-plan sont activées).

La solution consiste à gérer l'user prévu du côté du server et à résoudre le problème de jeton d'un périphérique entre plusieurs users en maintenant la relation un à un entre le périphérique et l'user.