web-dev-qa-db-ja.com

FCMプッシュ通知の問題:-「エラー」:「NotRegistered」

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"}]}

コードをデバッグするとき、データベースにデバイストークンがあり、プッシュ通知の送信を停止するファイアウォールはありません。

上記の関数を呼び出すたびに

「エラー」:「未登録」

任意のヘルプをいただければ幸いです。

前もって感謝します。

8
Shashank Shah

Phpについてあまり知りませんが、最近、別のプロジェクトで同じ問題に直面し、この方法で解決しました:

最初にこれを参照してください: Firebase Cloud MessagingのAPIキーはどこにありますか?

以下のスナップショットに示すように、更新されたAPIキーを取得します enter image description here

16
Maddy

ドキュメントによると、モバイルデバイスのテストではアプリがインストールされていないためです

NotRegisteredの場合、アプリケーションがデバイスからアンインストールされたか、クライアントアプリがメッセージを受信するように構成されていないため、サーバーデータベースから登録IDを削除する必要があります。

12
sahan maldeniya

これはクライアント側(デバイス)の問題であり、サービス側の問題ではありません。複数のシナリオがこれを引き起こす可能性があります。

  • クライアントアプリがGCMから登録解除された場合。
  • クライアントアプリが自動的に登録解除される場合、ユーザーがアプリケーションをアンインストールすると発生する可能性があります。たとえば、iOSで、APNSフィードバックサービスがAPNSトークンを無効として報告した場合。
  • 登録トークンの有効期限が切れた場合(たとえば、Googleが登録トークンを更新するか、iOSデバイスのAPNSトークンの有効期限が切れた場合)。
  • クライアントアプリは更新されたが、新しいバージョンがメッセージを受信するように構成されていない場合。

https://developers.google.com/cloud-messaging/http-server-ref を参照してください

アプリの起動時に、ローカルに保存したトークンが新しいトークンと一致するかどうかを確認します。そうでない場合は、サーバーのトークンを更新します。 FirebaseInstanceIDService::onTokenRefreshでもこれを行います。

1
Dan

アプリをアンインストールし、デバイストークンが変更されているかどうかを確認します。デバイストークンを更新すると、エラーはなくなります

0
Shivali Kapoor

「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」が返されました。

0
SHS

私は最近、この問題を修正した100%の解決策を持っています、このエラーは、firebaseセットアップapiキーを含まないデバイスでこの通知を送信しているために発生しますあなたのAndroidトークンは異なり、他のfirebaseセットアップへの送信リクエストは作成されませんでしたAndroid通知(メッセージ)を送信しようとするトークンユーザーがFirebase APIキーを使用しているプロジェクトと同じfirebaseプロジェクトからトークンを生成することを確認する必要がありますAndroid

0
msk

Firebaseは、アプリが初めて実行されたときにターゲットデバイスに対して一意のデバイスIDを生成し、デバイスのIDとして使用されている場合、ユーザーがアプリをアンインストールするかアプリのデータをクリアすると、ケースアプリを再インストールまたは再度開くと、通知を送信するためにfirebaseによって識別されないデバイスIDが異なります。これはエラーになりますNot Registered

0
maheshmnj