无需发送消息即可获取 GCM 规范注册 ID

Get GCM canonical registration ID without sending a message

我有一个使用 GCM 的应用程序有问题,情况是这样的:

  1. 应用已安装
  2. 应用程序调用 GCM 注册方法获取注册 ID "RID-1"
  3. 应用已卸载
  4. 再次安装该应用程序
  5. 应用再次调用GCM注册方法获取注册id"RID-2"

在第 5 步中,我需要获取之前的注册 ID,以便更新我的模型。

限制:
- 我试图在不使用外部存储的情况下执行此操作
- 我无法在服务器发送消息时更新模型,这应该在注册后完成,因为在应用程序中会为每个新设备创建一个新的配置文件

我知道此信息在 Google 服务器中,因为它是在您向旧注册 ID 发送消息时发送给您的。例如,如果我向 "RID-1" 发送消息,在响应中我得到新的(规范的)注册 ID 是 "RID-2"。我需要的是一种无需发送消息即可获取此信息的方法。

如果您需要更多背景信息,请告诉我。


我发现了几个相关问题,但答案不适用于这种情况:
Registration ID duplication for GCM
gcm canonical id should be updated or not
Persistance of gcm registration id
Google Cloud Messaging - Registration ID status
Android GCM: How to detect registered canonical ids in my own server?
Handling registration ID changes in Google Cloud Messaging on Android
(全部由@eran回答)

如果您只需要用户不应该收到通知,请发送一条消息,其中包含您的应用程序不需要的参数。如果没有强制文本和消息,您将获得规范并且您的应用将丢弃通知。

例如,我的 Cordova 应用程序插件需要从服务器接收到的数据中的密钥 'message'。否则它不会创建通知。

我知道这是一种 hack,但我认为考虑到限制,这将是最容易实现的。

我们需要用Canonical Id更新注册id(通过查找数组的索引位置)。你可以关注这个工作Ready use Code

您可以在 /send 请求中指定 "dry_run": true option

我发现设备不会收到带有 "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"
}]

同样,您的设备将不会收到任何推送通知。