获取GCM规范的注册ID而不发送消息

9
我有一个使用GCM的应用程序问题,情景如下:
  1. 应用程序已安装
  2. 应用程序调用GCM注册方法获取注册ID“RID-1”
  3. 应用程序已被卸载
  4. 应用程序再次安装
  5. 应用程序再次调用GCM注册方法获取注册ID“RID-2”
在步骤5中,我需要获取以前的注册ID,以便我可以更新我的模型。 限制:
- 我正在尝试在不使用外部存储的情况下完成此操作
- 当服务器发送消息时,我无法更新模型,因为必须在注册后执行,因为每个新设备都会在应用程序中创建一个新配置文件。
我知道这些信息存储在Google服务器中,因为当您向旧的注册ID发送消息时,会将其发送给您。例如,如果我向“RID-1”发送消息,则在响应中我会得到新的(规范)注册ID为“RID-2”。我需要一种不发送消息即可获取此信息的方法。
如果您需要更多上下文,请告诉我。
我发现了几个相关的问题,但这些答案并不适用于这种情况:
GCM 的注册 ID 重复
GCM 的 canonical id 是否应该更新?
GCM 注册 id 的持久性
Google Cloud Messaging - 注册 ID 状态
Android GCM:如何在自己的服务器上检测已注册的规范 ID?
如何处理 Google Cloud Messaging 在 Android 上的注册 ID 更改
(所有答案都由 @eran 回答)

1
如果您不将其存储在应用程序外部,那么当应用程序被卸载时就无法恢复它。我建议您将RID-1存储在其他地方 - 例如服务器。 - Martin
我将其存储在服务器上,并且在调用注册方法时拥有它,但我无法知道“RID-1”是该特定设备的旧注册ID。 - pomber
你解决了这个问题吗? - Ajoy
3个回答

5
你可以在发送请求中指定/send"dry_run": true选项
我发现使用"dry_run": true选项时设备不会收到任何推送通知,而服务器会收到canonical_ids响应。
以下是Ruby示例代码。您可能需要预先安装gcm Gem。 $ gem install gcm

ask_canonical_ids.rb

require 'gcm'
require 'json'

API_KEY = "YourApiKey"
gcm = GCM.new(API_KEY)

registration_ids = [
  'OldRegistrationId',
]

option = { data: { 'message' => 'Hello Gcm!' }, dry_run: true }
response = gcm.send_notification(registration_ids, option)

p response[:canonical_ids]

$ ruby ask_canonical_ids.rb的输出(格式化)

[{
  :old => "OldRegistrationId",
  :new => "NewRegistrationId"
}]

再次强调,您的设备将不会收到任何推送通知。


1
我们需要通过查找数组的索引位置,使用Canonical Id更新注册ID。您可以参考这个有效的代码示例进行操作。

0

如果您只需要确保用户不会收到通知,请发送带有参数的消息,说明您的应用程序不需要查找。如果通知中没有必需的文本和消息,则您将获得规范化的结果,并且您的应用程序将丢弃该通知。

例如,我的 Cordova 应用程序插件要求从服务器接收到的数据中包含键“message”。否则,它将不会创建通知。

我知道这有点像黑客行为,但考虑到限制,这可能是最容易实现的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接