0

我已使用Android Studio中的Firebase助手设置Firebase。我面临着一个小而令人烦恼的问题。这些通知在首次发布时不起作用,但会处理所有后续发布。例如仅在重新启动应用后才会收到Firebase通知

  • 应用程序安装并首次打开:未收到通知。
  • 如果我强制停止应用程序并重新启动:通知正在工作。

我怀疑订阅请求不适用于第一个请求。 下面是Android FirebaseInstanceIdService我令牌刷新代码:

@Override 
public void onTokenRefresh() { 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     if(refreshedToken != null){ 
      Log.d(TAG, "Refreshed token: " + refreshedToken); 
      FirebaseMessaging.getInstance().unsubscribeFromTopic("news"); 
      sendTokenToServer(refreshedToken); 
      FirebaseMessaging.getInstance().subscribeToTopic("news"); 
     } 
    } 

我得到的第一个推出了注册标记,它是成功发送到服务器。但是只有在重新启动应用程序后才会收到通知。 任何想法,为什么它不是在第一次启动工作?

按照注释中的建议编辑代码。我已将新标记保存到sharedPrefs并从活动调用了订阅功能。但这仍然不起作用。仅在重新启动应用程序后才能获取通知。

@Override 
    public void onTokenRefresh() { 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     if(refreshedToken != null){ 
      Log.d("FCGM", "Refreshed token: " + refreshedToken); 
      sendTokenToServer(refreshedToken); 
      myPrefs settings = new myPrefs(); //my class to handle prefs, working fine 
      settings.putBool("isNewToken",true); 
      settings.putString("token",refreshedToken); 
     } 
    } 

然后,在我的活动onCreate函数中,我在5秒延迟后调用订阅函数,以确保令牌生成并保存。

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
    myPrefs settings = new myPrefs(); 
    if (settings.getBool("isNewToken")){ 
     Log.d(TAG,"new token found"); //this is reaching 
     FirebaseMessaging.getInstance().unsubscribeFromTopic("news"); 
     FirebaseMessaging.getInstance().subscribeToTopic("news"); 
     settings.putBool("isNewToken",false); 
    } 
    } 
}, 5000); 

回答

1

尝试移动您的主题订阅到您的应用程序子类,或者您的主要活动,认购代码的话题看在呼叫发送正确的令牌之后。

另外,通过onTokenRefresh()中的订阅调用,如果您的用户在以后阶段取消订阅该主题,会发生什么情况?他们将无法在稍后重新订阅。

+0

好的,会尝试它并让你知道。 – Ranhot

+0

我已经将令牌保存到sharedPrefs并从活动中调用了主题订阅,但该应用仍然只从第二次启动开始才会收到通知。 – Ranhot

+0

您现在可以显示您的当前代码用于订阅吗?排除代码中的任何敏感内容。 – FrankR

0

原来问题是我的sendToken函数中的GET请求,它并没有完成。它应该是一个POST方法。我现在已经改变了它,并且工作完美。我目前onTokenRefresh代码:

@Override 
public void onTokenRefresh() { 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
    if(refreshedToken != null){ 
     FirebaseMessaging.getInstance().unsubscribeFromTopic("news"); 
     sendTokenToServer(refreshedToken); 
     myPrefs settings = new myPrefs(); 
     settings.putBool("isNewToken",true); 
     settings.putString("token",refreshedToken); 
     FirebaseMessaging.getInstance().subscribeToTopic("news"); 
     Log.d(TAG, "Subscribed"); 
    } 
} 

发送令牌代码看起来像现在这样:

client = (HttpURLConnection) url.openConnection(); 
client.setRequestMethod("POST"); 
client.setDoOutput(true); 
OutputStream outputPost = new BufferedOutputStream(client.getOutputStream()); 
outputPost.write(params.getBytes()); 
outputPost.flush(); 
outputPost.close(); 

希望它可以帮助别人有类似的问题。

相关问题