【问题标题】:Firebase token is generated every time new每次新建时都会生成 Firebase 令牌
【发布时间】: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


【解决方案1】:

我们也在一个项目中使用Firebase Cloud Messaging

我们在 android 应用中使用 firebase:

compile 'com.google.firebase:firebase-core:9.0.2'

每当我们重新启动应用程序时,我们收到的令牌都会保留。

最好确保每次启动应用时,令牌都会在您的 FirebaseInstanceService 中刷新:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

  private static final String TAG = "MyFirebaseIIDService";

  @Override public void onTokenRefresh() {
    ...

    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    // check here.
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    ...
  }
}

然后确保在您的服务器中正确设置了Firebase Server

如果您每次启动应用程序时都获得不同的令牌,这可能是一个错误。但请确保您已使用 newest Firebase Library 测试过您的 android 项目。

这些问题可能与您的问题有关:
Firebase Android Authentication failed: expired_token (Auth token is expired)

【讨论】:

  • 我们目前使用的是最新版本 com.google.firebase:firebase-messaging:9.2.1。这只是关于令牌生成,因此服务器在这里不会成为问题。我们的应用中只有 FirebaseMessagingService 和 FirebaseInstanceIdService 这两个服务,其他地方没有额外的代码。根据您的截图,每次我们终止应用程序时,我们都会遇到带有新令牌的 onTokenRefresh()
  • 我已经尝试使用 firebase 9.2.1 并且它工作正常。令牌仍然存在。正如@ArthurThompson 所说,更改应用程序令牌时会调用哪个代码?
  • onTokenRefresh 现已弃用
猜你喜欢
  • 2020-02-09
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2018-09-26
  • 2022-07-27
  • 2016-04-01
相关资源
最近更新 更多