web-dev-qa-db-fra.com

IOS notifications de données avec FCM

J'utilise FCM (messagerie cloud Firebase) 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 souhaitez que FCM gère l'affichage d'une notification sur votre au nom de l'application. Et nous utilisons les messages de données lorsque vous souhaitez uniquement traiter les messages dans votre application. C'est de par leur conception.

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

Ma question est que puis-je 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 à 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() est uniquement invoqué lorsque l'application est lancée, donc aucun message d'arrière-plan apparaîtra si vous envoyez un message de données.

10
Shayan C

D'après ce que je comprends jusqu'à présent, il n'y a aucun moyen de résoudre correctement ce problème du côté iOS. Cela fonctionne parfaitement du côté Android côté parce que l'application est réveillée dans tous les états (premier plan, arrière-plan et fermée).

Vous pouvez envoyer deux types de messages:

A notification-message qui est affiché et géré directement par le système d'exploitation.

A data-message qui est géré par l'application.

Si vous ajoutez une balise personnalisée, elle devient maintenant un message de données et doit être gérée par l'application. Vous pouvez ajouter un content_available tag dans le message de données pour informer l'application du message, mais le problème est que le message de données n'est remis à l'application dans iOS que si l'application est au premier plan (ouverte) ou en arrière-plan (minimisée). Le message de données ne sera pas remis à l'application si l'utilisateur a "forcé" la fermeture de l'application (même avec les notifications d'arrière-plan activées).

La solution consiste à gérer l'utilisateur prévu côté serveur et à résoudre le problème de plusieurs utilisateurs à un seul appareil-jeton en maintenant la relation un à un appareil-jeton à utilisateur.

16
Shayan C

Essayez de définir content_available sur true.

De la documentation fcm:

Remarque: Si vous souhaitez envoyer des messages composés uniquement de valeurs-clés personnalisées à un appareil iOS lorsque l'application est en arrière-plan, définissez des paires clé-valeur personnalisées dans la clé 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
    }
}
16
brozot

J'ai remarqué que la notification arrivera lorsque l'application sera fermée de force au cas où la priorité de notification est définie sur é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 client iOS, la priorité normale et élevée sont analogues aux niveaux de priorité 5 et 10 des APN.

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

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

10 – Envoyez le message Push immédiatement. Les notifications avec cette priorité doivent déclencher 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 qui contient uniquement la clé de contenu disponible.

5 - Envoyez le message Push à un moment qui prend en compte les considérations d'alimentation du périphérique. Les notifications avec cette priorité peuvent être regroupées et envoyées en rafales. Ils sont limités et, dans certains cas, ne sont pas livrés. Si vous omettez cet en-tête, le serveur APNs définit la priorité sur 10.

Mise à jour 1:

La notification ci-dessus est envoyée via FCM api et a été reçue alors que l'application a été tué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 utilisateurs sur un seul appareil ou un utilisateur avec plusieurs appareils.

Côté serveur, vous devez vous assurer qu'un fcm_id unique ne peut être attribué qu'à un seul utilisateur. Cela signifie qu'un appareil est attribué à un utilisateur, donc un seul utilisateur sera notifié par appareil.

En outre, un utilisateur peut avoir plusieurs fcm_ids, ce qui signifie que l'utilisateur peut avoir plus d'appareils et être connecté.

Lorsque l'utilisateur_2 se connecte au même périphérique de l'utilisateur_1, fcm_id doit être détaché de l'utilisateur_1 et attaché à utilisateur_2. De cette manière, seul l'utilisateur actuellement connecté recevra le message.

12
Prcela

Mauvaise documentation de Firebase!

Pour iOS, les messages de données ne peuvent pas être reçus lorsque l'application est supprimée. Mais cela n'est mentionné nulle part dans leur documentation. J'ai donc contacté Firebase et c'est ce qu'ils ont dit.

"Bien qu'il existe un paramètre content_available, les messages de données ne peuvent pas être reçus lorsque l'application est supprimée. Ils ne peuvent être reçus qu'en arrière-plan et au premier plan. Si vous souhaitez recevoir des messages de données lorsque l'application est supprimée, vous devez les envoyer le long d'un afficher les messages ".

Il est donc préférable d'utiliser APNS pour ios plutôt si vous avez déjà pensé à utiliser la même charge utile pour Android et Ios dans FCM.

12
emilpmp

Le problème clé est l'envoi d'un message à un groupe d'utilisateurs spécifique pour la dernière identité connectée.

En fait, vous pouvez utiliser la messagerie par sujet pour résoudre le problème. Supposons que vous ayez 3 balises utilisateur/groupes A, B et C. Lorsque FCM est initialisé, inscrivez-vous à 1 rubrique pour Tous les utilisateurs pour vous assurer que vous pouvez envoyer un message à toutes les balises utilisateur.

Pour des balises utilisateur spécifiques, abonnez-vous à A si l'utilisateur s'est connecté en tant que A. Une fois l'utilisateur déconnecté et connecté en tant que B, vérifiez si l'utilisateur s'est abonné à A/C ou non. Si oui, désabonnez-vous de A/C puis abonnez-vous à B. Cela peut ainsi éviter de gérer les balises impliquées dans la section des données.

2
Wendy Chan