【发布时间】:2016-11-25 08:39:39
【问题描述】:
我们在应用中使用 Firebase 云消息传递来显示推送通知。根据FirebaseInstanceId doc,Instance ID 是稳定的,除非:
- 应用删除实例 ID
- 应用已在新设备上恢复
- 用户卸载/重新安装应用程序
- 用户清除应用数据
但是,每次我们启动应用程序(之前已停止,未恢复)时,都会通过 FirebaseInstanceIdService onTokenRefreshed() 回调返回不同的 Token。
我想知道这是服务的正常行为还是代码中存在错误。
更新
root build gradle 文件中的依赖关系:
classpath 'com.google.gms:google-services:3.0.0'
app build gradle 文件中的依赖关系:
"com.google.firebase:firebase-messaging:9.2.1"
"com.google.android.gms:play-services-base:9.2.1"
// defined at the bottom of the same file: plugin for firebase
apply plugin: 'com.google.gms.google-services'
FirebaseInstanceIdService:
@Override
public void onTokenRefresh() {
// Get the saved token from the shared preferences
final String oldToken = PrefsHelper.getStringValue(PREF_DEVICE_TOKEN);
Log.d(TAG, "Old token: " + oldToken);
// Get updated InstanceID token.
final String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
if (TextUtils.isEmpty(oldToken)) {
handleNewToken(refreshedToken);
} else {
handleTokenUpdate(oldToken, refreshedToken);
}
}
【问题讨论】:
-
这绝对不是预期的行为,在卸载并重新安装应用程序之前,您通常拥有相同的令牌。您是否收到了 onTokenRefresh 回调,当应用程序令牌更改时会调用该回调?
-
是的,每次我们启动应用程序(之前退出,而不是恢复)时,我们都会通过服务的回调 onTokenRefresh() 获得一个新令牌。我更新了问题
-
你用过
compile 'com.google.firebase:firebase-core:9.2.1'吗? -
找到原因:应用程序在重启时清理了太多数据以及保存的令牌,该令牌保存在应用程序内部存储中。感谢您的帮助,并为那个愚蠢的错误感到抱歉
-
很高兴您解决了问题。每个人有时都会犯错。感谢您从您的经验中教导我们。 :)。
标签: android firebase firebase-cloud-messaging