我在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);
答案 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();
希望它可以帮助有类似问题的人。