Je reçois un problème étrange concernant l'envoi de notifications Push à Android via FCM.
Objectif: - Avoir une erreur lors de l'envoi de la notification push
Vous trouverez ci-dessous un scénario permettant d'envoyer des notifications push à Android.
public static function SendMultipleNotificationAndroid($groups)
{
//your api key SERVER API KEY
$apiKey = Yii::$app->params['Android_api_key'];
$url = 'https://fcm.googleapis.com/fcm/send';
$headers = array(
'Authorization:key=' . $apiKey,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
foreach($groups as $resG){
$users = $resG['users'];
$msg = $resG['message'];
$type = $resG['notification_type'];
$notification_data = $resG['notification_data'];
$deviceTokens = [];
foreach($users as $resUser){
$deviceTokens[] = $resUser['device_token'];
//Add Friend badge count +1
Common::AddRemoveBadgeCount($resUser['user_id']);
}
if(!empty($deviceTokens)){
$fields = array(
'registration_ids' => $deviceTokens,
'priority' => 'high',
'collapse_key' => $resG['notification_type'],
'time_to_live' => 2419200,
"click_action" =>"NotificationListingActivity",
'data' => [
"title" => "ProjectName",
"body" => $resG['message'],
"action_tag" => $resG['notification_type'],
"message" => $resG['message'],
'notification_type' => $type,
'notification_data' => $notification_data,
'sound' => 'default',
]
);
//Print result
p($ch,0);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
curl_exec($ch);
}
}
curl_close($ch);
}
Donc, le problème, c’est que lorsque j’envoie une notification unique, cela fonctionne bien, mais lorsque j’envoie plusieurs notifications, j’ai toujours une erreur.
<pre>Resource id #5</pre>{"multicast_id":4818908994630396118,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136045570022%c3bae3c6002e9358"}]}
<pre>Resource id #5</pre>{"multicast_id":5218359780835228544,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136046618669%c3bae3c6002e9358"}]}
Au moment de déboguer le code, nous avons un jeton de périphérique dans notre base de données, pas de pare-feu qui cesse d’envoyer des notifications Push.
Chaque fois que j'appelle la fonction ci-dessus je me suis
"erreur": "NotRegistered"
Toute aide serait appréciée.
Merci d'avance.
Je ne connais pas grand chose à propos de php, mais récemment, j'ai rencontré le même problème dans un autre projet et j'ai résolu ce problème:
Référez-vous d'abord à ceci: Où puis-je trouver la clé API pour la messagerie Cloud Firebase?
et obtenez la clé API mise à jour comme indiqué ci-dessous snapshot
Selon la documentation, c’est parce que votre application n’a plus installé votre application pour le test des appareils mobiles.
S'il s'agit de NotRegistered, vous devez supprimer l'ID d'enregistrement de la base de données de votre serveur car l’application a été désinstallée du appareil ou l'application cliente n'est pas configurée pour recevoir des messages.
Il s'agit d'un problème (périphérique) côté client, et non pas côté service . Plusieurs scénarios peuvent entraîner les conséquences suivantes:
Voir https://developers.google.com/cloud-messaging/http-server-ref
Au démarrage de l'application, je vérifie si le jeton que j'ai stocké localement correspond au nouveau jeton. Sinon, j'actualise le jeton sur mes serveurs. Je le fais aussi dans FirebaseInstanceIDService::onTokenRefresh
.
Voyez si vous avez désinstallé l'application et votre jeton de périphérique est modifié. Mettez à jour le jeton de périphérique et votre erreur disparaîtra.
En cherchant le problème "NotRegistered", nous avons trouvé ce qui suit ...
À la fin du périphérique, la génération du jeton de notification de périphérique a été effectuée en suivant le code une fois, lorsque l'utilisateur lance pour la première fois l'application après l'installation.
RegToken = FirebaseInstanceId.getInstance().getToken(senderId, "FCM"); // Old code
Nous utilisions une autre classe dérivée de "FirebaseMessagingService" pour créer/recevoir des notifications. Mais la méthode suivante manquait dans cette classe.
// New code
@Override
public void onNewToken(String token) {
Log.d(TAG, "Refreshed token: " + token);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(token);
}
Nous avons constaté que la méthode ci-dessus était appelée par le système FCM dans l'appareil à chaque démarrage de l'application. (L'application n'était pas désinstallée, la méthode donnait toujours un jeton différent à chaque fois.) Nous avons donc appelé notre méthode 'sendRegistrationToServer (token);' soumettre le jeton à notre serveur avec le 'DeviceId' et d'autres données d'identification. Lorsque nous avons envoyé une notification du serveur php sur ce jeton, il a renvoyé "envoyé" au lieu de "NotRegistered".