1. ホーム
  2. android

[解決済み] Firebase Cloud Messaging - ログアウトの処理

2023-05-07 18:32:07

質問

ユーザーが私のアプリケーションからログアウトし、デバイスへの通知を受け取らないようにしたい場合、どのように対処すればよいでしょうか。

私は

FirebaseInstanceId.getInstance().deleteToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE)

しかし、私はまだ私のデバイスの registration_id .

また、これが削除すべきトークンであることを確認しました。

FirebaseInstanceId.getInstance().getToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE)

または単に FirebaseInstanceId.getInstance().getToken() ).

また、試しに FirebaseInstanceId.getInstance().deleteInstanceId() も試しましたが、次に FirebaseInstanceId.getInstance.getToken を呼び出すと、null を受け取ります (2回目では動作します)。

私は推測します、後に deleteInstanceId をすぐに呼び出すことができます。 getToken() を呼び出すこともできますが、ハックされているように見えます。また、そこに この答え があり、それはすべきではないと述べていますが、それは明らかに動作しないトークンの削除を提案しています。

では、これを処理するための正しい方法は何でしょうか?

どのように解決するのか?

なるほど、なんとか検証してみたところ、以下のような結論になりました。

  1. deleteToken() の対になるものです。 getToken(String, String) に対してではなく getToken() .

渡すSender IDが異なるSender ID(google-services.jsonで確認できるのと同じIDではない)場合にのみ動作します。例えば、異なるサーバーからアプリへの送信を許可したい場合、以下のように呼び出します。 getToken("THEIR_SENDER_ID", "FCM") を呼び出し、それらに 認可 を付与し、アプリに送信します。これは、その特定の送信者にのみ対応する別の登録トークンを返します。

将来、もしあなたが彼らの 認証 を削除した場合、アプリに送信するために deleteToken("THEIR_SENDER_ID", "FCM") . これは対応するトークンを無効にし、Senderがメッセージを送信しようとすると、意図した動作として、彼らは NotRegistered エラーが発生します。

  1. 自分自身のSenderのトークンを削除するためには、正しい処理として deleteInstanceId() .

特筆すべきはこれ 回答者: @Prince 特に、このコードサンプルは私を助けてくれました。

すでに @MichałK さんの投稿で行っているように、このコードで deleteInstanceId() , getToken() は、新しいトークンのリクエストを送信するために呼び出される必要があります。しかし、2回目に呼び出す必要はありません。ということは onTokenRefresh() onNewToken() が実装されていれば、自動的に新しいトークンを提供するトリガーがかかるはずです。

略して deleteInstanceId() > getToken() > チェック onTokenRefresh() onNewToken() .

ノート : 呼び出し deleteInstanceId() を呼び出すと、自分のアプリのトークンが削除されるだけではありません。トピック サブスクリプションと、アプリ インスタンスに関連付けられたその他のすべてのトークンが削除されます。


あなたが呼び出しているのは deleteToken() を正しく呼び出していますか?audienceの値は、(あなたがリンクした私の回答からもわかるように) "アプリサーバーの送信者IDに設定"であるべきです。あなたが渡している getId() の値を渡していますが、これはSender IDと同じではありません(アプリのインスタンスIDの値が含まれています)。また、どのようにメッセージを送信していますか (App Server または Notifications Console)?

getToken()getToken(String, String) は異なるトークンを返します。私の答えを参照してください ここで .

<ブロッククオート

また FirebaseInstanceId.getInstance().deleteInstanceId() を呼び出したが、次に FirebaseInstanceId.getInstance.getToken null を受け取ります (2回目では動作します)。

を呼び出しているからでしょう。 getToken() を呼び出すと、まだ生成中です。意図した動作になっているだけです。

推測するに deleteInstanceId をすぐに呼び出すことができます。 getToken() を再び呼び出すことができますが、ハックされているように見えます。

そうではありません。新しく生成された(すでに生成されていることが前提ですが)トークンを取得する方法です。だから、大丈夫だと思います。