FCMを使用してAndroidにプッシュ通知を送信するという奇妙な問題が発生しています。
目標:-プッシュ通知の送信中にエラーが発生しました
以下は、プッシュ通知を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);
}
したがって、問題は単一の通知を送信すると正常に機能するが、複数の通知を送信すると毎回エラーが発生することです
<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"}]}
コードをデバッグするとき、データベースにデバイストークンがあり、プッシュ通知の送信を停止するファイアウォールはありません。
上記の関数を呼び出すたびに
「エラー」:「未登録」
任意のヘルプをいただければ幸いです。
前もって感謝します。
Phpについてあまり知りませんが、最近、別のプロジェクトで同じ問題に直面し、この方法で解決しました:
最初にこれを参照してください: Firebase Cloud MessagingのAPIキーはどこにありますか?
ドキュメントによると、モバイルデバイスのテストではアプリがインストールされていないためです
NotRegisteredの場合、アプリケーションがデバイスからアンインストールされたか、クライアントアプリがメッセージを受信するように構成されていないため、サーバーデータベースから登録IDを削除する必要があります。
これはクライアント側(デバイス)の問題であり、サービス側の問題ではありません。複数のシナリオがこれを引き起こす可能性があります。
https://developers.google.com/cloud-messaging/http-server-ref を参照してください
アプリの起動時に、ローカルに保存したトークンが新しいトークンと一致するかどうかを確認します。そうでない場合は、サーバーのトークンを更新します。 FirebaseInstanceIDService::onTokenRefresh
でもこれを行います。
アプリをアンインストールし、デバイストークンが変更されているかどうかを確認します。デバイストークンを更新すると、エラーはなくなります
「NotRegistered」問題の検索中に、次のことがわかりました...
デバイスの終了時に、ユーザーがインストール後に初めてアプリを起動したときに、デバイス通知トークンの生成が次のコードで1回行われました。
RegToken = FirebaseInstanceId.getInstance().getToken(senderId, "FCM"); // Old code
「FirebaseMessagingService」から派生した他のクラスを使用して、通知を作成/受信していました。しかし、そのクラスには次のメソッドがありませんでした。
// 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);
}
上記のメソッドは、Appを起動するたびにデバイスのFCMシステムによって呼び出されることがわかりました。 (アプリはアンインストールされませんでしたが、メソッドは毎回異なるトークンを与えていました。)そこで、メソッドを「sendRegistrationToServer(token);」と呼びました。 「DeviceId」およびその他の識別データとともにトークンをサーバーに送信します。このトークンでphpサーバーから通知を送信すると、「NotRegistered」ではなく「sent」が返されました。
私は最近、この問題を修正した100%の解決策を持っています、このエラーは、firebaseセットアップapiキーを含まないデバイスでこの通知を送信しているために発生しますあなたのAndroidトークンは異なり、他のfirebaseセットアップへの送信リクエストは作成されませんでしたAndroid通知(メッセージ)を送信しようとするトークンユーザーがFirebase APIキーを使用しているプロジェクトと同じfirebaseプロジェクトからトークンを生成することを確認する必要がありますAndroid
Firebaseは、アプリが初めて実行されたときにターゲットデバイスに対して一意のデバイスIDを生成し、デバイスのIDとして使用されている場合、ユーザーがアプリをアンインストールするかアプリのデータをクリアすると、ケースアプリを再インストールまたは再度開くと、通知を送信するためにfirebaseによって識別されないデバイスIDが異なります。これはエラーになりますNot Registered