2017-04-03 127 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我收到null(它在第二次嘗試中有效)。

我想,在deleteInstanceId之後,我可以立即再次撥打getToken(),但它看起來像一個黑客。還有this answer其中規定不應該這樣做,但它建議刪除顯然不起作用的令牌。

那麼處理這個問題的正確方法是什麼?

回答

13

好的。所以我設法做一些測試,並得出以下結論:

  1. deleteToken()getToken(String, String)對方,而不是getToken()

它只適用於您傳遞的發件人ID是不同的發件人ID(不能在您的google-services.json中可以看到的ID)。例如,您希望允許不同的服務器發送到您的應用程序,請撥打getToken("THEIR_SENDER_ID", "FCM"),讓他們將授權發送到您的應用程序。這將返回一個僅與該特定發件人相對應的不同註冊令牌。

未來,如果您選擇刪除授權發送到您的應用程序,那麼您將不得不使用deleteToken("THEIR_SENDER_ID", "FCM")。這將使相應的令牌失效,並且當發件人嘗試發送消息時,如預期的行爲,他們將收到NotRegistered錯誤。

  1. 爲了刪除您自己的發件人的令牌,正確的處理是使用deleteInstanceId()

特別提到這個answer by @Prince,特別是幫助我的代碼示例。

由於@MichałK已經在他的帖子中做過調用deleteInstanceId(),getToken()之後應該調用以發送一個新的令牌請求。但是,您不必第二次調用它。只要onTokenRefresh()被實現,它應該自動觸發爲你提供新的令牌。

簡而言之,deleteInstanceId()>getToken()>檢查onTokenRefresh()

注意:調用deleteInstanceId()不僅會刪除您自己的應用程序的令牌。它將刪除與應用實例關聯的所有主題訂閱和所有其他令牌。


你確定你打電話給deleteToken()嗎?觀衆的價值應該是(也可以從我的答案中看出,你鏈接的)是「設置爲應用服務器的發件人ID」。你傳遞的getId()值是不一樣的發件人ID(包含價值應用實例ID)。另外,您如何發送消息(App Server或Notifications Console)?

getToken()getToken(String, String)返回不同的令牌。看到我的回答here

我也試過FirebaseInstanceId.getInstance().deleteInstanceId(),但隨後的下一次我打電話FirebaseInstanceId.getInstance.getToken我收到空(它可以在第二次嘗試)。

這可能是因爲您第一次打電話給getToken()時,它仍在生成。這只是預期的行爲。

我想,deleteInstanceId後,我可以立即再次撥打getToken(),但它看起來像一個黑客。

不是真的。這就是你將如何獲得新生成的(假設它已經生成)令牌。所以我認爲這很好。

+0

這是唯一的「發件人ID」,當我打電話爲gettoken或deleteToken沒有拋出一個錯誤。當我使用我的Firebase控制檯中的文本項目ID時,這兩種方法都會拋出。然後我使用了我在googleservices.json中找到的數字ID,它看起來像是有效的。然後通過getId(),它也沒有拋出。所以我認爲就是這樣。 –

+0

至於黑客,我必須在deleteInstanceId後立即調用它,因此它在第一次返回null,然後在登錄時調用它以使其工作。這就是爲什麼我認爲這是一個黑客。 –

+0

我會試着看看我是否可以稍後再做一些測試並複製行爲。如果我有時間,會回到這裏。乾杯! –

2

試試這個

我是工作在相同的條件下,當我做了我的退出從我的應用程序,但問題是,登出我仍然從fire-base.so得到推送通知後試圖刪除在火力令牌但在註銷方法刪除令牌時,應用程序進來的登錄方法,其節目NULL後的時候儘量讓friebase的道理,所以我的應用程序被刪除火力token.After工作終於2天我得到了我的解決方案後崩潰..hope這也將爲你工作。

  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方法)

    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(); 
    

在我的情況下,其作品對我來說,如果不做評論我是什麼問題