2017-04-03 23 views
14

ユーザがアプリケーションからログアウトしても、デバイスに通知を受け取らないようにするにはどうすればよいですか。Firebase Cloud Messaging - ログアウトの処理

私は

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と呼んだときは、それは2回目の試行で動作します。

私はdeleteInstanceIdの後にすぐにgetToken()と呼ぶことができましたが、ハックのように見えます。また、実行してはならないと述べたthis answerもありますが、明らかに動作しないトークンを削除することを提案しています。

これを処理する正しい方法は何ですか?

答えて

13

大丈夫です。だから私はいくつかのテストを行うために管理し、次のように結論づけています

  1. deleteToken()getToken(String, String)の対応ではなく、getToken()ためです。

送信する送信者IDが異なる場合(Google-services.jsonに表示されるIDとは異なるID)である場合にのみ機能します。たとえば、別のサーバーがアプリに送信できるようにするには、getToken("THEIR_SENDER_ID", "FCM")に電話して許可をアプリに送信します。これにより、その特定の送信者にのみ対応する別の登録トークンが返されます。

今後承認を削除してアプリに送信する場合は、deleteToken("THEIR_SENDER_ID", "FCM")を使用する必要があります。これにより、対応するトークンが無効になり、送信者が意図した動作としてメッセージを送信しようとすると、NotRegisteredエラーが発生します。

  1. 独自の送信者のトークンを削除するには、deleteInstanceId()を使用してください。

特記事項answer by @Prince特にこれを手助けするコードサンプル。

@MichałKは既にdeleteInstanceId()を呼び出した後、新しいトークンの要求を送信するためにgetToken()を呼び出す必要があります。ただし、2度目に呼び出す必要はありません。 onTokenRefresh()が実装されている限り、新しいトークンの提供を自動的に開始するはずです。

簡略化すると、deleteInstanceId()>getToken()>チェックonTokenRefresh()です。

注:deleteInstanceId()に電話すると、自分のアプリのトークンが削除されるだけでなく、すべてのトピックサブスクリプションと、アプリインスタンスに関連付けられている他のすべてのトークンが削除されます。


deleteToken()と正しく電話していますか?あなたがリンクしている私の答えから見ても、観客の価値は "アプリサーバーの送信者IDに設定"されているはずです。 getId()の値はSender IDと同じではありません(アプリインスタンスIDの値が含まれています)。また、どのようにメッセージ(App ServerまたはNotifications Console)を送信していますか?

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

私もFirebaseInstanceId.getInstance().deleteInstanceId()を試してみましたが、その後、私はFirebaseInstanceId.getInstance.getToken呼び出す次回は、私は(それが2回目の試行で動作)はnullを受けます。

あなたがgetToken()を呼び出している最初の時間は、それはまだ発生していますので、それはおそらくです。これは意図した動作です。

私は推測、deleteInstanceId後、私はすぐに再びgetToken()を呼び出すことができますが、それはハックのように見えます。

実際にはありません。それはあなたが新しい(すでに生成されていれば)トークンを得る方法です。だから私はそれがいいと思います。

+0

これは、私がgetTokenまたはdeleteTokenを呼び出したときにエラーを投げなかった唯一の "送信者ID"です。私がfirebaseコンソールからテキストプロジェクトIDを使用したとき、両方のメソッドが投げられました。それから私はgoogleservices.jsonで見つけた数字のIDを使用し、それがうまくいったように見えました。それから、getId()を渡して、それを投げなかった。だから私はそれがわかった。 –

+0

ハックに関しては、deleteInstanceIdの直後に呼び出さなければならないので、初めてnullを返し、それが動作するためにログイン中に呼び出すようにしてください。だから私はそれがハックだと思うのです。 –

+0

後でいくつかのテストを行い、その動作を再現できるかどうか試してみます。時間があればここに戻ってきます。乾杯! –

2

試してみてください。この

私は自分のアプリケーションからの私のログアウトを行っていたが、問題は、私はまだfire-base.soからプッシュ通知を取得したログアウトした後 しようとしたということであったとき、私は、同じ条件で働いていた

削除firebaseトークンしかし、アプリケーションがログインメソッドで来るときにログアウトメソッドでトークンを削除した後、そのNULLを表示すると、私のアプリはfirebaseトークンを削除した後クラッシュしていたので、 ..これがあなたのためにもうまくいくことを願っています。あなたのログアウト方法で

  1. あなたのログイン方法活性の

    new AsyncTask<Void,Void,Void>() 
    { 
        @Override 
        protected Void doInBackground(Void... params) 
        { 
         { 
          try 
          { 
           FirebaseInstanceId.getInstance().deleteInstanceId(); 
          } catch (IOException e) 
          { 
           e.printStackTrace(); 
          } 
         } 
         return null; 
        } 
        @Override 
        protected void onPostExecute(Void result) 
        { 
         //call your activity where you want to land after log out 
        } 
    }.execute(); 
    
  2. は(onresume方法を好む)トークンfirebase再び発生する主な方法でfirebaseトークンを削除することはできませんので、バックグラウンドでfirebaseトークンを削除

    私の場合、私のためにその作品で
    new AsyncTask<Void,Void,Void>() 
    { 
        @Override 
        protected Void doInBackground(Void... params) 
        { 
    
         String token = FirebaseInstanceId.getInstance().getToken(); 
         while(token == null)//this is used to get firebase token until its null so it will save you from null pointer exeption 
         { 
          token = FirebaseInstanceId.getInstance().getToken(); 
         } 
         return null; 
        } 
        @Override 
        protected void onPostExecute(Void result) 
        { 
    
        } 
    }.execute(); 
    

あるものを私にコメントしていない場合問題

関連する問題