我想我误解了一些事情。对不起。
我正在尝试将推送消息实施到我的应用中。
在GCM Web控制台(“API Access”)中,我添加了一个项目并检索了一个API密钥,对于整个项目来说似乎是相同的(无论项目在这个上下文中意味着什么)和一个以适用于我的每个应用的apps.googleusercontent.com。
然后我只是从google复制了gcm-client示例,删除了编译错误,添加了libs并使其在手机上运行,但不在模拟器上运行。 这里需要senderID,这似乎是来自API访问Url的“projectid”,对吧?
到目前为止,非常好。
为了实现服务器,我需要一个API密钥。这是底部GCM API项目页面中的一个(“简单API访问”)。此外,我需要一个registrationID。似乎是在第一次运行时由我的应用程序计算的,对吗?所以我需要将这个ID从我的应用程序复制到我的服务器中?
但有没有办法直接通过GCM从我的应用程序中检索registrationID? E. g。当我在Play商店中获得我的应用程序时,如何获取下载我的应用程序的设备的ID? 对不起,但我对整个GCM机制感到困惑:(
编辑:取消注册的过程如何运作。我如何学习,手机不再需要任何信息,有多种原因会发生什么?
答案 0 :(得分:1)
服务器无法从GCM获取注册ID(除了在GCM的响应中获取规范注册ID的特殊情况,但是为了使服务器必须已经知道更旧的您的应用在该设备上使用的注册ID)。安装在设备上的每个应用实例都必须将注册ID发送到您的服务器,您的服务器应将这些ID保存在某个持久存储(数据库,文件等)中。
如果您的应用程序从GCM中明确注销,它可以通知您的服务器它已从GCM取消注册(与您向服务器发送注册ID的呼叫类似),以及您的服务器将删除其注册ID。但是,更常见的情况是,通过从设备卸载,应用程序未隐式注册。在这种情况下,它无法通知您的服务器它已被卸载。当您的服务器首次向卸载该应用程序的设备发送通知时,它将获得成功的响应(因为GCM尚未知道该应用程序已卸载),但稍后尝试向该设备发送通知将导致NotRegistered
错误,告知服务器删除相关的注册ID。
答案 1 :(得分:0)
只需让你的应用程序尽快将regID发送到您的服务器。
然后在您的服务器上,您可以随意存储它,列表,平面文件,数据库或其他任何内容。
我已经使用这种方法在MySQL中存储多个regID,并通过简单地将id与消息一起发送,让“主”电话知道所有电话的所有服务器ID。反对让手机知道无法管理的regID,因为这些可能会随着时间而改变。
通过这种设置,我可以相当轻松地让主电话向其负责的所有其他电话多播一条消息。
希望这是有道理的。
答案 2 :(得分: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
将此注册表存储在共享首选项中,以便您可以重复使用它。