gpt4 book ai didi

android - 如何从 GCM 获取规范 ID

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:40:17 26 4
gpt4 key购买 nike

我正在尝试为我的设备获取一个唯一 ID,以便我可以从我的服务器接收推送通知。

正如所有 turorials 所说:我使用 GMC 注册:

  GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
String regid = gcm.register(PROJECT_NUMBER); // <---- duplicated if uninstalled/ reinstalled
SendRegIdToServer(regId);

现在,我将 regId 发送到我的服务器并保存在设备上。

当我卸载并重新安装时出现问题,由于本地存储丢失,我要求GCM重新注册并获得新的注册ID。因此,我的服务器有相同设备的副本。

我查看了 SO,但很多问题都在 GCMRegistrar 上,现在已弃用。人们说使用唯一的 Canonical ID。但我如何获得它?

我正在使用 gcm.register 并使用该 ID,这显然在服务器上是重复的。

感谢任何帮助。

最佳答案

当您从您的服务器向 google 的 gcm 服务器发送消息时,会在响应中返回 Canonical id。

https://developer.android.com/google/gcm/http.html#response

Interpreting a success response

When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:

Field Description multicast_id Unique ID (number) identifying the multicast message. success Number of messages that were processed without an error. failure Number of messages that could not be processed. canonical_ids Number of results that contain a canonical registration ID. See Advanced Topics for more discussion of this topic. results Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields: message_id: String representing the message when it was successfully processed. registration_id: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request. error: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried). If the value of failure and canonical_ids is 0, it's not necessary to parse the remainder of the response.

更新

以下是有关规范 ID 的更多信息。基本上,如果设备注册 ID 以某种方式与 Google 认为应该的不同步,那么当您的服务器发送带有不同步 ID 的请求时,gcm 服务器将在其响应中包含正确的 ID将来使用。

想一想,它的工作方式是;当设备向 gcm 注册时,您的服务器应该已经存储了注册 ID。您的服务器使用该 ID 向 gcm 发送请求,gcm 使用该 ID 向您的设备发送消息。 GCM 无法在不告知服务器的情况下获取您设备上的注册 ID。如果是这样,您的服务器将继续发送错误的注册 ID。相反,gcm 告诉服务器它用于特定设备的 reg id 是错误的,然后您的服务器可以向设备发送消息以将其存储的 reg id 更新为应有的内容,然后设备可以确认更改在 REG ID 中。下面的信息暗示有一些时间限制,因为“坏”ID 仍然可以用于发送消息的时间。我认为假设它应该足够长,让您的服务器更改设备 ID(通过使用“错误”ID 的 gcm 消息)

规范 ID

在服务器端,只要应用程序运行良好,一切都应该正常工作。但是,如果应用程序中的错误触发同一设备的多次注册,则可能很难协调状态,最终可能会收到重复的消息。

GCM 提供了一种称为“规范注册 ID”的工具,可以轻松地从这些情况中恢复。规范注册 ID 定义为您的应用程序请求的最后一次注册的 ID。这是服务器在向设备发送消息时应使用的 ID。

如果稍后您尝试使用不同的注册 ID 发送消息,GCM 将照常处理该请求,但它会在响应的 registration_id 字段中包含规范注册 ID。确保用这个规范 ID 替换存储在您服务器中的注册 ID,因为您使用的 ID 最终将停止工作。

关于android - 如何从 GCM 获取规范 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27072824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com