0

我想我误解了什么。对此感到抱歉。

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

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

  2. 然后我简单地从谷歌复制了 gcm-client 示例,删除了编译错误,添加了库并让它在手机上运行,​​而不是在模拟器上运行。这里需要一个senderID,这似乎是API访问Url中的“projectid”,对吧?

到目前为止,一切都很好。

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

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

编辑:取消注册的过程如何工作。我怎么知道,电话不再需要任何消息,在许多不同的原因下会发生什么?

4

3 回答 3

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

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

于 2013-10-20T20:49:54.627 回答
0

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

然后在您的服务器上,您可以随心所欲地存储它,一个列表、一个平面文件、数据库或其他任何东西。

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

有了这个设置,我可以很容易地让主电话向它负责的所有其他电话多播一条消息。

希望这是有道理的。

于 2013-10-18T11:32:23.567 回答
0

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

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

然后,您应该像这样获得您的registrationID:

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

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

于 2013-10-18T11:35:23.517 回答