Firebase 实例 ID:在 21.0.0 中弃用 getId()

Posted

技术标签:

【中文标题】Firebase 实例 ID:在 21.0.0 中弃用 getId()【英文标题】:Firebase instance id: deprecation of getId() in 21.0.0 【发布时间】:2020-10-28 13:09:33 【问题描述】:

随着最近发布的 FirebaseInstanceId 和 FirebaseCloudMessaging (21.0.0),Firebase 已弃用 iid 包,getToken()getId() 方法现已弃用。

根据Firebase release note,方法getToken()移动到FirebaseMessaging

之前:

FirebaseInstanceId.getInstance().getToken()

之后:

FirebaseMessaging.getInstance().getToken()

使用fcmToken,但要检索实例ID,FirebaseMessaging 和FirebaseInstanceId 中都没有可用的方法。


那么instance_id 是否被认为是无用的 id,不应再使用?或者有替代品吗?

【问题讨论】:

【参考方案1】:

FirebaseInstanceId 类已弃用,要获取令牌,请使用 FirebaseMessagingClass。可以使用以下代码生成令牌:

FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() 
    @Override
    public void onComplete(@NonNull Task<String> task) 
      if (!task.isSuccessful()) 
        Log.w(TAG, "Fetching FCM registration token failed", task.getException());
        return;
      

      // Get new FCM registration token
      String token = task.getResult();

      // Log and toast
      String msg = getString(R.string.msg_token_fmt, token);
      Log.d(TAG, msg);
      Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    
);

关于Firebase InstanceId,官方文档是这样说的:

公共任务getInstanceId()-> 此方法已弃用。 对于实例标识符,请改用 FirebaseInstallations.getId()。对于 FCM 注册令牌,请改用 FirebaseMessaging.getToken()。

【讨论】:

【参考方案2】:

Fcm 令牌

弃用前

val fcmToken = FirebaseInstanceId.getInstance().getToken()

替换

val fcmToken = FirebaseMessaging.getInstance().getToken()

FirebaseInstanceId#getId

弃用前

val istanceId = FirebaseInstanceId.getInstance().getId()

替换

查看FirebaseInstanceId#getId()的代码,我看到了建议你应该改用FirebaseInstallations#getId

此方法已弃用

请改用FirebaseInstallations.getId()

val instanceId = FirebaseInstallation.getInstance().getId()

【讨论】:

请注意,这可能不会返回相同的内容。 FirebaseInstallation instanceId 不是用于 FCM 的那个 FirebaseMessaging.getInstance().getToken() 给了我与已弃用的 FirebaseInstanceId.getInstance().getToken() 相同的结果 那是fcmToken。问题是关于 instanceId 而不是令牌。 InstanceId可以使用FirebaseInstanceId#getId()方法来实现。【参考方案3】:

FCM 令牌:

使用firebase_messaging包

String? token = await FirebaseMessaging.instance.getToken();

安装 ID:

使用flutterfire_installations包

String id = await FirebaseInstallations.instance.getId();

安装授权令牌:

String token = await FirebaseInstallations.instance.getToken();

【讨论】:

【参考方案4】:

试试这个

 public String getToken() 
String token;
        FirebaseMessaging.getInstance().getToken()
                .addOnCompleteListener(new OnCompleteListener<String>() 
                    @Override
                    public void onComplete(@NonNull Task<String> task) 
                        if (task.isSuccessful()) 

                           token = task.getResult();
                            

                        
                    
                );
        
        return token;
    

【讨论】:

这将返回 FCM 令牌,即 result.tokeniid.getToken()。根据接受的答案,有一个FirebaseInstanceId.id 现在由FIS.getId() 实现

以上是关于Firebase 实例 ID:在 21.0.0 中弃用 getId()的主要内容,如果未能解决你的问题,请参考以下文章

首次打开应用时创建 Firebase 实例 ID

什么情况下应用会删除 Firebase Instance ID?

从 Firebase iOS SDK 获取 user_pseudo_id

使用用户 ID 从 Firebase 获取数据

在 Xcode 上更改 Firebase Crashlytics 的捆绑包 ID

Firebase 云消息推送通知不再出现在 iOS 上