每个用户帐户的唯一 Firebase Instance-Id

Posted

技术标签:

【中文标题】每个用户帐户的唯一 Firebase Instance-Id【英文标题】:Unique Firebase Instance-Id for every user account 【发布时间】:2019-04-11 09:01:42 【问题描述】:

我不确定如何在同一设备上正确处理不同的用户帐户,因为 Firebase 只会为每台设备创建一个 Instance-Id。

因此,我认为可以在用户注销时删除 Instance-Id,并在新用户登录时创建一个新的。

登录时:

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(task -> System.out.println(task.getResult().getToken()));

注销时:

FirebaseInstanceId.getInstance().deleteInstanceId()

Firebase 是否确保 Instance-Id 是唯一的,即使它是在同一设备上多次生成的? 我更喜欢这种方法的原因是它可以简单地一次性取消用户对所有主题的订阅,而且推送通知可以发送给特定用户。

【问题讨论】:

【参考方案1】:

Firebase 是否确保 Instance-Id 是唯一的,即使它在同一设备上多次生成?

重新生成实例 ID 确实总是会产生一个唯一值。只要您确保在用户注销时删除实例 ID,下次您将获得一个新的令牌。

为确保您的令牌注册表(您存储令牌的地方)不会累积太多过期令牌,请务必在用户退出时删除令牌,或者当您发现令牌不再有效时发送消息。见my answer to this question。

【讨论】:

感谢您的建议。我发现了以下语句:“一个应用程序实例可以订阅不超过 2000 个主题”。你知道“应用实例”是指单个设备上的应用程序的Instance-ID还是指整个项目?如果第一个陈述为真:是否适合为每个用户创建一个主题,以便用户登录的所有设备都可以订阅它?还是应该向属于用户帐户的所有设备令牌发送通知?第一种方法会容易得多,因为我只需要数据库中的用户 ID。 为每个用户创建一个主题并不少见。请记住,如果知道主题的名称,任何人都可以订阅该主题,并且该主题的扇出不在您的控制范围内,并且可能比自己进行扇出要慢。跨度> “任何人”是什么意思?我认为有必要知道身份验证密钥,例如对于iid.googleapis.com/iid/v1:batchAdd。 要订阅,您只需要知道您的 APK 中可用的主题和配置信息。【参考方案2】:

如果您希望设备上的每个用户都有唯一的 FCM 实例 ID,您应该调用 FirebaseInstanceId.getInstance().deleteInstanceId() 每次注销帐户时。 然后在下一个FirebaseInstanceId.getInstance().instanceId 调用,您将获得一个新的唯一实例 ID

但是有一点你需要知道。 在新线程上调用 deleteInstanceId(),而不是 MainThread

【讨论】:

【参考方案3】:

处理您的问题的最佳方法是使用topic 消息传递。

来自docs:

基于发布/订阅模型,FCM 主题消息传递允许您向已选择加入特定主题的多个设备发送消息。您可以根据需要编写主题消息,FCM 会处理路由并将消息可靠地传递到正确的设备。

当用户登录应用时,可以订阅某个主题,例如:

FirebaseMessaging.getInstance().subscribeToTopic("weather")
    .addOnCompleteListener(new OnCompleteListener<Void>() 
        @Override
        public void onComplete(@NonNull Task<Void> task) 
            String msg = getString(R.string.msg_subscribed);
            if (!task.isSuccessful()) 
                msg = getString(R.string.msg_subscribe_failed);
            
            Log.d(TAG, msg);
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        
    );

然后用户可以根据主题名称接收通知。然后当用户点击退出按钮时,可以调用如下:

FirebaseMessaging.getInstance().unsubscribeFromTopic("weather");

【讨论】:

你可以有多个用户订阅一个主题..你可以有 2000 个用户订阅主题 a 和 2000 个其他用户订阅主题 b..

以上是关于每个用户帐户的唯一 Firebase Instance-Id的主要内容,如果未能解决你的问题,请参考以下文章

检测用户是不是从应用程序上的唯一设备创建帐户

Flutter & Firebase - 如何只允许每台设备有 1 个帐户

使用为每个用户生成的唯一密钥限制 Firebase 数据库规则。 (安卓工作室)

每个提供商的 firebase 用户 ID 是唯一的(facebook、twitter、密码)

用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

带有 Flutter 的 Firebase 中的唯一用户名