我想我误解了什么。对不起。
我正在尝试将推送消息实现到我的应用程序。
-
在 GCM Web 控制台("API 访问")中,我添加了一个项目并检索了一个 API 密钥,该密钥对于整个项目(无论项目在此上下文中意味着什么)似乎相同,并且对于我的每个应用程序,都检索了一个以 apps.googleusercontent.com 结尾的 clientID。
-
然后我只是从谷歌复制了 gcm 客户端示例,删除了编译错误,添加了库并使其在手机上运行,但不在模拟器上运行。这里需要一个发件人ID,它似乎是API访问URL中的"项目ID",对吧?
目前为止,一切都好。
为了实现服务器,我需要一个 API 密钥。这是底部GCM API项目页面("简单API访问")中的那个。此外,我需要一个注册ID。似乎在第一次运行时就由我的应用程序计算出来,对吧?所以我需要将此 ID 从我的应用程序复制到我的服务器?
但是有没有办法直接通过 GCM 从我的应用程序中检索注册 ID? 例如,当我的应用在 Play 商店中时,如何获取下载了我的应用的设备的 ID?抱歉,我对整个 GCM 机制有点困惑:(
编辑:取消注册的过程如何工作。我如何得知手机不再需要任何消息,在众多各种原因下会发生什么?
-
服务器无法从 GCM 获取注册 ID(除了在 GCM 的响应中获取规范注册 ID 的特殊情况,但要获取服务器必须已经知道您的应用在该设备上使用的旧注册 ID)。安装在设备上的应用的每个实例都必须将注册 ID 发送到服务器,并且服务器应将这些 ID 保存在某个持久存储(数据库、文件等)中。
-
如果您的应用显式从 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 存储在共享首选项中的某个位置,以便您可以重复使用它。