2017-04-03 129 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(); 
    

在我的情况下,其作品对我来说,如果不做评论我是什么问题