2015-01-06 56 views
8

我有使用GCM一个应用程序的一个问题,该方案是这样的:获取GCM规范注册ID,而不发送消息

  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回答)

+1

如果您没有将其存储在应用程序之外,则在卸载应用程序时无法将其还原。我建议你的商店RID-1在其他地方 - 一个服务器或许 – Martin

+0

我将它存储在服务器中,并且在调用注册方法的时候有,但我无法知道“RID-1”是该特定设备的旧注册ID – pomber

+0

您是否解决了此问题? – Ajoy

回答

5

您可以在/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" 
}] 

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

0

如果您所需要的只是用户不应收到通知,请发送带有您的应用程序无法查找的参数的消息。您将获得规范,如果通知没有强制性文本和消息,您的应用将放弃通知。

例如,我的Cordova应用程序插件需要从服务器接收的数据中包含密钥“消息”。否则,它不会创建通知。

我知道这是一种黑客攻击,但我认为有限制,这将是最容易实现的。

1

我们需要使用Canonical Id更新注册ID(通过查找数组的索引位置)。您可以按照此工作Ready use Code