每个用户帐户的唯一Firebase实例ID

时间:2019-04-11 09:01:42

标签: java android firebase push-notification

我不确定如何在同一台设备上适当地处理不同的用户帐户,因为Firebase每个设备仅创建一个实例ID。

因此,尽管如此,我可以在用户注销时删除Instance-Id,并在新用户登录时创建一个新实例。

登录时:

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

注销时:

FirebaseInstanceId.getInstance().deleteInstanceId()

Firebase是否可以确保实例ID是唯一的,即使它在同一设备上多次生成? 我之所以喜欢这种方法,是因为很容易一次将用户从所有主题中退订,而且可以将推送通知发送给特定用户。

3 个答案:

答案 0 :(得分:1)

如果要为设备上的每个用户拥有唯一的FCM实例ID,则应致电FirebaseInstanceId.getInstance().deleteInstanceId() 每次注销帐户。 然后在下一个FirebaseInstanceId.getInstance().instanceId 呼叫,您将获得一个新的唯一Intance ID

但是您需要了解一点。 在新线程而不是MainThread上调用deleteInstanceId()

答案 1 :(得分:0)

处理问题的最佳方法是使用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");

答案 2 :(得分:0)

  

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

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

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