GCM:如何从服务器向应用程序发送消息(丢失注册ID,通知ID..)



我想我误解了什么。对不起。

我正在尝试将推送消息实现到我的应用程序。

  1. 在 GCM Web 控制台("API 访问")中,我添加了一个项目并检索了一个 API 密钥,该密钥对于整个项目(无论项目在此上下文中意味着什么)似乎相同,并且对于我的每个应用程序,都检索了一个以 apps.googleusercontent.com 结尾的 clientID。

  2. 然后我只是从谷歌复制了 gcm 客户端示例,删除了编译错误,添加了库并使其在手机上运行,但不在模拟器上运行。这里需要一个发件人ID,它似乎是API访问URL中的"项目ID",对吧?

目前为止,一切都好。

为了实现服务器,我需要一个 API 密钥。这是底部GCM API项目页面("简单API访问")中的那个。此外,我需要一个注册ID。似乎在第一次运行时就由我的应用程序计算出来,对吧?所以我需要将此 ID 从我的应用程序复制到我的服务器?

但是有没有办法直接通过 GCM 从我的应用程序中检索注册 ID? 例如,当我的应用在 Play 商店中时,如何获取下载了我的应用的设备的 ID?抱歉,我对整个 GCM 机制有点困惑:(

编辑:取消注册的过程如何工作。我如何得知手机不再需要任何消息,在众多各种原因下会发生什么?

  1. 服务器无法从 GCM 获取注册 ID(除了在 GCM 的响应中获取规范注册 ID 的特殊情况,但要获取服务器必须已经知道您的应用在该设备上使用的旧注册 ID)。安装在设备上的应用的每个实例都必须将注册 ID 发送到服务器,并且服务器应将这些 ID 保存在某个持久存储(数据库、文件等)中。

  2. 如果您的应用显式从 GCM 取消注册,它可以通知服务器它已从 GCM 取消注册(方式类似于将注册 ID 发送到服务器的调用),并且您的服务器将删除其注册 ID。但是,更常见的情况是通过从设备卸载来隐式取消注册应用。在这种情况下,它无法通知您的服务器已卸载。当服务器首次向卸载应用的设备发送通知时,它将获得成功的响应(因为 GCM 还不知道应用已卸载),但稍后尝试向该设备发送通知将导致NotRegistered错误,告知服务器删除相关的注册 ID。

只需让您的应用程序在获得 regID 后立即将其发送到您的服务器即可。

然后在您的服务器上,您可以根据需要存储它,列表,平面文件,数据库或其他任何内容。

我使用这种方法在MySQL中存储多个regID,并通过简单地将ID与消息一起发送,让"主"手机知道所有手机的所有服务器ID。反对让手机知道无法管理的注册ID,因为这些可能会随着时间的推移而改变。

通过此设置,我可以很容易地让主电话将消息多播到它负责的所有其他电话。

希望这是有道理的。

首先,您应该创建 GCM 实例:

GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(HomeScreenActivity.this);

然后,您应该像这样获取您的注册ID:

String regId = gcm.register("xxxxxxx"); // xxxxxx is your ProjectNumber wich can be found in your GCM console

将此 regId 存储在共享首选项中的某个位置,以便您可以重复使用它。

最新更新