Android设备唯一识别码用于与谷歌的Firebase令牌生成器配合使用

9
我正在创建一个应用程序,使用谷歌的Firebase作为其推送通知服务。我只是使用推送通知服务器,并且不想使用其它服务(例如数据库、认证等)。
在我的应用程序中,注册的用户可以拥有多个设备和多个Firebase令牌。问题出现在当`onRefreshToken`被调用时。我应该知道用户正在使用哪个设备,并更新该特定设备的令牌在我的数据库中。因此,我需要知道每个设备的唯一标识符,在其生命周期内不会改变。
我想知道是否有更好的方法来解决这个问题。如果没有,我对Android的唯一ID感到困惑。两种选择是`Settings.Secure.ANDROID_ID`,但可能存在问题(所以我不确定是否应该使用它),另一个是`TelephonyManger.getDeviceId()`,有时会返回空值,而且对于没有SIM卡槽的设备(如平板电脑)也无法使用。
那么你建议我怎么做?

1
您可以将当前的实例 ID 令牌存储在应用程序的共享首选项中,然后在 onTokenRefresh() 中从那里读取它。 - Frank van Puffelen
3个回答

6

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

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

Android在8.0(API 26)中更改了ANDROID_ID,使其仅适用于特定应用程序、用户和设备ID的组合。这意味着您并没有真正获得一个对于每个应用程序始终为真实的设备ID,而是获得了一个特定应用程序、具有特定签名密钥的设备上的设备ID。您可以卸载应用程序并重新安装应用程序,ANDROID_ID将与之前相同。
这使得用户更安全,但仍允许您在以下情况下持久保存Firebase设备令牌:
- 应用程序删除实例ID - 应用程序在新设备上恢复用户 - 卸载/重新安装应用程序 - 用户清除应用数据
然后在Firebase中,您可以将它们保存为:
DeviceTokens:
    deviceID:  firebaseDeviceToken
    deviceID:  firebaseDeviceToken

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

如果您还使用Cloud Functions向每个列出的deviceToken发送FCM(如果有多个设备,则必须这样做),则可以在发送第一条通知后检查响应。如果出现错误,并且该错误返回一个声明该令牌无效的消息,则可以处理该错误,然后从服务器中删除它。

  • 不需要设备ID,对用户更加安全。
  • 向无效的令牌发送1个FCM,但之后不再发送
  • 如果Firebase团队更改其错误或错误消息,则必须更改函数,否则此方法将不再起作用。

有关更多详细信息,请参见此答案: Handling refresh tokens for FCM device groups


3
在类中,您可以通过扩展“FirebaseInstanceIdService”并在“onTokenRefresh”方法中获取它,如下所示:

FirebaseInstanceId.getInstance().getId()

0

您可以通过将自定义类扩展为FirebaseInstanceIdService类来获取设备令牌。

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseInsIDService";

    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Device Token: " + refreshedToken);
    }
}

在你的AndroidManifest.xml文件中添加service
<service
        android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
 </service>

现在,您可以使用设备令牌在用户移动设备上发送通知。

我强烈建议检索最新的更新注册令牌。

当以下情况发生时,注册令牌可能会更改:

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

当您需要检索当前令牌时,请调用FirebaseInstanceId.getInstance().getToken()。如果尚未生成令牌,则此方法返回null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接