Google 云消息传递实例 ID 是永久的还是临时的?

Posted

技术标签:

【中文标题】Google 云消息传递实例 ID 是永久的还是临时的?【英文标题】:Is Google cloud messaging instanceID permanent or temporarly? 【发布时间】:2015-07-16 03:21:39 【问题描述】:

我正在使用谷歌云消息传递创建一个信使应用程序,我只是想使用 instanceID 中的令牌来识别用户,但由于某种未知原因,我从这个方法中获得了第一个令牌

InstanceID instanceID = InstanceID.getInstance(this); String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

与我使用“from”标签从服务器获取的令牌不同。

    public void handleIncomingDataMessage(Map<String, Object> jsonObject) 

    String from = jsonObject.get("from").toString(); 

我只需要知道这是我的编码问题还是真的发生了变化,我不能再依赖令牌了。

【问题讨论】:

GCM 应用了很多规则,最好从developers.google.com/cloud-messaging获取更多信息 是的,我读到了,但我只需要知道我是否可以将此令牌用作唯一标识符?因为我在某个地方读到了它的独特之处,并且在您决定更改之前不会更改,但看起来谷歌经常更改它。 是的,从 GCM 返回的注册 ID 是唯一的,直到您取消注册设备或超过设备上限。 但正如我上面给出的例子,它似乎不时变化 【参考方案1】:

实例 ID 确实应该是恒定的,如下所述: What is Instance ID?

但是,有两点需要注意:

确保不要在代码中的某处调用getID() 方法。它旨在获得一个新的令牌。 出于安全原因,Google 可以决定强制更新它。您必须处理这种情况:“您的应用必须实现一个侦听器以响应来自 Instance ID 服务的令牌刷新请求。”

【讨论】:

感谢您的评论,是的,正如您所提到的,在某些情况下它可能会被更改,因此它不是唯一识别用户的好标识符,所以我将摆脱它并将实现我自己的字符串来识别用户【参考方案2】:

(我不懂英文) 再次调用此代码:

String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

将生成新令牌,它不会等于您之前获取到服务器的旧令牌。

【讨论】:

我不想再调用这个方法了。我只需要澄清令牌是唯一的,并且不会因请求而异

以上是关于Google 云消息传递实例 ID 是永久的还是临时的?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 与 Android Java 中的 Google 云消息传递

为 Google 云消息传递设置服务器端和客户端

用于 Google 云消息传递客户端的 BroadcastReceiver 或 GCMBroadcastReceiver?

问题+澄清:使用 Google 云消息传递从 Raspberry Pi 向 Android 手机发送消息

适用于 iOS 应用的 GCM(Google 云消息传递)

使用 Google 云消息传递和服务工作者的桌面推送通知