无需发送消息即可获取 GCM 规范注册 ID
Get GCM canonical registration ID without sending a message
我有一个使用 GCM 的应用程序有问题,情况是这样的:
- 应用已安装
- 应用程序调用 GCM 注册方法获取注册 ID "RID-1"
- 应用已卸载
- 再次安装该应用程序
- 应用再次调用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"
}]
同样,您的设备将不会收到任何推送通知。
我有一个使用 GCM 的应用程序有问题,情况是这样的:
- 应用已安装
- 应用程序调用 GCM 注册方法获取注册 ID "RID-1"
- 应用已卸载
- 再次安装该应用程序
- 应用再次调用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"
}]
同样,您的设备将不会收到任何推送通知。