Ich bekomme ein seltsames Problem mit dem Senden von Push-Benachrichtigungen an Android mit FCM.
Ziel: - Fehler beim Senden der Push-Benachrichtigung
Im Folgenden finden Sie das Szenario, über das ich Push-Benachrichtigungen an Android senden kann
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);
}
Das Problem ist also, wenn ich eine einzelne Benachrichtigung sende, funktioniert es gut, aber wenn ich mehrere Benachrichtigungen sende, erhielt ich jedes Mal einen Fehler
<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"}]}
Während wir den Code debuggen, befindet sich in unserer Datenbank ein Device-Token, keine Firewall, die das Senden von Push-Benachrichtigungen beendet.
Jedes Mal, wenn ich über der Funktion anrufe, bekam ich
"Fehler": "NotRegistered"
Jede Hilfe wäre dankbar.
Danke im Voraus.
Ich weiß nicht viel über php, aber kürzlich bin ich in einem anderen Projekt mit demselben Problem konfrontiert worden und habe diesen Weg gelöst:
Stellen Sie dies zuerst fest: Wo finde ich den API-Schlüssel für Firebase Cloud Messaging?
und erhalten Sie einen aktualisierten API-Schlüssel wie unten gezeigt. snapshot
Laut dem Dokument ist dies darauf zurückzuführen, dass beim Testen mobiler Geräte Ihre App nicht mehr installiert ist
Wenn es nicht registriert ist, sollten Sie die Registrierungs-ID aus .__ entfernen. Ihre Serverdatenbank, da die Anwendung von der .__ deinstalliert wurde. Gerät oder die Client-App ist nicht für den Empfang von Nachrichten konfiguriert.
Dies ist ein clientseitiges (Geräte-) Problem, nicht diensteseitig Mehrere Szenarien können folgendes verursachen:
Siehe https://developers.google.com/cloud-messaging/http-server-ref
Beim Start der App überprüfe ich, ob das lokal gespeicherte Token mit dem neuen Token übereinstimmt. Wenn nicht, aktualisiere ich das Token auf meinen Servern. Ich mache das auch in FirebaseInstanceIDService::onTokenRefresh
.
Prüfen Sie, ob Sie die App deinstalliert haben und Ihr Gerätetoken geändert wurde. Aktualisieren Sie das Gerätetoken, und Ihr Fehler ist verschwunden
Bei der Suche nach dem Problem "NotRegistered" haben wir Folgendes gefunden ...
Am Geräteende erfolgte die Generierung des Gerätebenachrichtigungstokens durch folgenden Code einmal, wenn der Benutzer die App zum ersten Mal nach der Installation startet.
RegToken = FirebaseInstanceId.getInstance().getToken(senderId, "FCM"); // Old code
Wir haben andere Klassen verwendet, die von "FirebaseMessagingService" abgeleitet wurden, um Benachrichtigungen zu erstellen/zu erhalten. In dieser Klasse fehlte jedoch die folgende Methode.
// 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);
}
Wir haben festgestellt, dass die obige Methode bei jedem Start der App vom FCM-System im Gerät aufgerufen wurde. (Die App war nicht deinstalliert, dennoch gab die Methode jedes Mal ein anderes Token ab.) Daher haben wir unsere Methode 'sendRegistrationToServer (token);' das Token zusammen mit der 'DeviceId' und anderen Identifikationsdaten an unseren Server zu übermitteln. Als wir über dieses Token eine Benachrichtigung vom PHP-Server gesendet haben, wurde "gesendet" anstelle von "NotRegistered" zurückgegeben.
Ich habe eine 100-prozentige Lösung, mit der ich vor kurzem dieses Problem behoben habe. Dieser Fehler tritt auf, weil Sie diese Benachrichtigung auf einem Gerät senden, das Ihren API-Schlüssel für das Firebase-Setup nicht enthält Ihr Android Token war anders und Ihre Sendeanforderung an ein anderes Firebase-Setup, für das Sie nicht Android Token, für das Sie eine Benachrichtigung (Nachricht) senden möchten) erstellt haben, war anders Müsste sicherstellen, dass Ihr Benutzer Android Token aus demselben Firebase-Projekt generiert, für welches Projekt Sie den Firebase-API-Schlüssel verwenden
Die Sache ist, dass firebase eine eindeutige Geräte-ID für Ihr Zielgerät generiert, wenn die App zum ersten Mal ausgeführt wird, und als Identität des Geräts verwendet wird. Wenn der Benutzer die App deinstalliert oder die Daten der App löscht, dann In that case Beim erneuten Installieren oder Öffnen der App unterscheidet sich die Geräte-ID, die von der Firebase nicht identifiziert wird, um die Benachrichtigung zu senden. Dies führt zu dem Fehler Nicht registriert