与谷歌的 firebase 令牌生成器一起使用的 Android 唯一设备标识符

roo*_*mir 7 android firebase firebase-cloud-messaging

我正在创建一个使用 goolg 的 firebase 作为其推送通知服务的应用程序。我只是使用推送通知服务器,不想使用它的其他服务(例如数据库、身份验证等)。

在我的应用程序中,注册的用户可以拥有多个设备,因此可以拥有多个 firebase 令牌。onRefreshToken调用时出现问题。我应该知道用户正在使用哪个设备并在我的数据库中更新该特定设备的令牌。所以我应该知道每个设备的唯一标识符,该标识符在设备的生命周期中不会改变。

我想知道是否有更好的方法来解决这个问题,如果没有,我对 android 唯一 ID 感到非常困惑。这两个选项Settings.Secure.ANDROID_ID可能有一些问题(所以我不确定我是否应该使用它)并且TelephonyManger.getDeviceId()有时返回 null 并且对于没有 sim 插槽的设备(例如平板电脑)。

那你建议我怎么做?

Jef*_*ett 5

这个答案有两个解决方案:

1)使用 ANDROID_ID 作为设备标识符。

2)在第一条消息发送给它之后,使用云函数和 FCM 来确定一个坏令牌。

1) 尝试 Settings.Secure.ANDROID_ID 以获取设备 ID。

String deviceAppUID = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
if (deviceAppUID!=null) {
    setFirebaseTokenInServer(deviceAppUID, FirebaseDeviceToken);}
Run Code Online (Sandbox Code Playgroud)

Android 正在更改 8.0 (API 26) 中的 ANDROID_ID,以便它仅适用于特定应用程序、用户和设备 ID 的组合。当这种情况发生时,您并没有真正获得一个对于每个应用程序总是正确的设备 ID,而是在您的特定设备上为您的特定应用程序获取设备 ID,以及其特定的签名密钥。您可以卸载该应用程序,然后重新安装该应用程序,ANDROID_ID 将与之前相同。

这使用户更安全,但仍允许您保留 Firebase 设备令牌,以防注册令牌因以下原因发生变化:

  • 应用删除实例 ID
  • 应用程序在新设备上恢复用户
  • 卸载/重新安装应用程序
  • 用户清除应用数据

然后在 Firebase 中,您可以将这些保存为:

DeviceTokens:
    deviceID:  firebaseDeviceToken
    deviceID:  firebaseDeviceToken
Run Code Online (Sandbox Code Playgroud)

2) 使用 Firebase Cloud Messaging 和 Firebase Google Cloud Functions 来确定错误的令牌。

如果您还使用 Cloud Functions 将 FCM 发送到每个列出的 deviceToken(如果有多个设备,这是必要的),您可以在发送第一个通知后检查响应。如果出现错误,并且错误返回一条消息指出令牌错误,您可以处理该错误,然后将其从服务器中删除。

  • 不需要设备 ID,对用户来说更安全。
  • 将 1 个 FCM 发送到错误的令牌,但之后不会再次发送
  • 如果 Firebase 团队更改其错误或错误消息,您将必须更改该函数,否则将不再起作用。

有关更多详细信息,请参阅此答案: 处理 FCM 设备组的刷新令牌


erg*_*cak 3

在课堂上,您在方法“onTokenRefresh”中扩展“FirebaseInstanceIdService”,您可以像这样得到它:

FirebaseInstanceId.getInstance().getId()
Run Code Online (Sandbox Code Playgroud)