仅在重新启动应用

时间:2017-01-17 12:47:04

标签: android firebase push-notification firebase-cloud-messaging

我在Android Studio中使用Firebase助手设置了Firebase。我正面临着一个小而棘手的问题。通知在首次启动时不起作用,但适用于所有后续启动。 e.g。

  • 首次应用安装和打开:未收到通知。
  • 如果我强制停止应用并重新启动:通知现在正在运行。

我怀疑订阅请求在第一次请求时无效。 以下是我在Firefox 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并从活动中调用了Subscription函数。但这仍然没有工作。应用程序仅在重新启动应用程序后才会收到通知。

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

2 个答案:

答案 0 :(得分:1)

尝试将您的主题订阅移动到您的Application子类或您的主要活动中,订阅该主题的代码会在调用中发送正确的令牌后查找。

此外,只有在onTokenRefresh()中进行订阅调用,如果您的用户在稍后阶段取消订阅该主题,会发生什么?他们以后无法重新订阅。

答案 1 :(得分: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();

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