46 votes

Firebase Cloud Messaging dernière collapse_key non reçue (taux limité ?)

J'ai un service qui utilise Firebase Cloud Messaging pour communiquer avec ses clients Android en utilisant Messages de données FCM avec le collapse_key ensemble de paramètres. Extrait de la documentation sur les clés rabattables :

Lorsqu'un message plus récent rend un fil plus ancien, le message en question devient sans objet pour l'application cliente et le FCM remplace l'ancien message. Par exemple, les messages de type "send-to-sync" ou les messages de notification périmés.

Voici ce que je recherche. Je n'ai pas besoin de toutes les mises à jour, seule la dernière est nécessaire. Mais, j'en ai besoin ASAP si l'utilisateur est en ligne .


Cependant, j'obtiens une limitation de débit bizarre qui n'entraîne aucun code d'erreur HTTP. C'est assez facilement reproductible, il suffit de faire 20 messages de données consécutifs et de surveiller l'Android. FirebaseMessagingService.onMessageReceived :

for i in {1..20}; do 
  curl -v -X POST --header "Authorization: key=$SERVER_KEY" \
       --Header "Content-Type: application/json" \
       https://fcm.googleapis.com/fcm/send \
       -d "{\"to\":\"$CLIENT_TOKEN\", \
            \"data\":{\"counter\":\"$i\"}, \
            \"priority\":\"high\", \
            \"collapse_key\": \"test\" \
           }"
done

Le script bash ci-dessus est un peu difficile à lire, mais j'ai un counter variable qui m'intéresse.

Après quelques messages reçus ( counter=~10 ) il s'arrête et vous devez basculer l'état du réseau pour obtenir le dernier message avec counter=20 . Le dernier message apparaît également après quelques minutes (normalement ~10 minutes) lorsqu'un check-in firebase est demandé ( ?).

Suppression de collapse_key de la commande curl ci-dessus a pour résultat que les 20 messages sont reçus (où counter={1..20} ).


Donc, la question : Est-ce un bug ? Ou est-ce que je suis en train de m'éteindre (/débit limité) parce que j'abuse de l'interface (puisque toutes les requêtes renvoient un 200 réponse, je pensais que j'étais bien).

0 votes

Notez que j'utilise "Messages de données" et non "Messages de notification" si cela fait une différence.

0 votes

Les deux sites priority et time_to_live sont spécifiés en dehors de la notification ou data de sorte qu'il n'y a pas vraiment de différence entre le type de charge utile que vous utilisez (bien que chacun d'entre eux ait un paramètre de type Valeurs par défaut ). D'après moi, pour ce qui est de la latence, il est préférable de définir simplement le paramètre ttl à 0 mais comme vous le savez déjà, le message deviendra une maintenant ou jamais type de message. Mais selon le comportement de FCM (même avant pour GCM), il tentera d'envoyer le message dès que possible, en fonction des paramètres.

0 votes

@AL. On dirait que collapse_key obtient un taux limité voir ma question éditée.

1voto

Prateek Bhardwaj Points 1938
<?php
#API access key from Google API's Console
    define( 'API_ACCESS_KEY', 'YOUR-SERVER-API-ACCESS-KEY-GOES-HERE' );
    $registrationIds = $_GET['id'];
#prep the bundle
     $msg = array
          (
        'body'  => 'Body  Of Notification',
        'title' => 'Title Of Notification',
                'icon'  => 'myicon',/*Default Icon*/
                'sound' => 'mySound'/*Default sound*/
          );
    $fields = array
            (
                'to'        => $registrationIds,
                'notification'  => $msg
            );

    $headers = array
            (
                'Authorization: key=' . API_ACCESS_KEY,
                'Content-Type: application/json'
            );
#Send Reponse To FireBase Server    
        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch );
        curl_close( $ch );
#Echo Result Of FireBase Server
echo $result;

Mettez vos données dans le corps du texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X