C2DM:只有注册的Google帐户才会收到来自服务器的消息

时间:2011-09-01 14:16:10

标签: android android-c2dm

我似乎在花费数小时试图弄清楚出了什么问题。感觉我完全误解了一些东西。所以这就是事情:

在尝试使C2DM工作的同时,我首先在Google的C2DM服务上注册了一个专门的电子邮件地址。那是我想用来从服务器向客户端发送消息的那个。然后我将代码添加到客户端应用程序并注册设备以进行C2DM。获取的注册ID将发送到服务器并存储在db。

当我尝试向设备发送消息(无论我使用curl还是php)时,问题就出现了。发送到我在第一时间注册到C2DM服务的帐户可以完美地运行。但是,使用 Error=NotRegistered发送到任何其他设备失败。我只是不明白为什么。我使用注册帐户中的auth key和我从客户端创建的registration id。我已经(重新)创建了registration id数百次,但根据Google代码页 Error=NotRegistered表示registration_id无效。

尝试澄清:

我可以完美地将邮件发送到链接到我用来注册C2DM的Google帐户的注册ID。将消息发送到不同注册ID的所有其他尝试都会失败。所以我基本上可以将消息发送到一个注册ID。

也许我应该检查一下我对C2DM的理解:服务器是否仅限于向单个设备发送消息?我以为服务器可以向已经提交注册ID的每个设备发送消息......

我缺少什么/误会?

万分感谢,Steff

5 个答案:

答案 0 :(得分:2)

它发送给哪些设备没有限制。更有可能的是,您发送的注册ID错误,或者您发送的设备未成功注册。

我建议仔细检查注册ID,如果可以,请在另一台设备上进行测试,确保在向Google的服务器提交消息时获得200响应,并确认设备肯定已成功注册以接收C2DM消息

我也建议你阅读这篇文章。这是我见过的最好的C2DM教程。 http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html

答案 1 :(得分:1)

服务器端代码中有令牌信息,允许您选择要发送消息的设备,当您想要将消息发送到其他设备时,是否更改了此令牌(转换为其他设备的令牌)?

答案 2 :(得分:1)

我有同样的问题,未来:'背景资料' (手机配置)被禁用。打开它就解决了这个问题。

答案 3 :(得分:0)

我认为您的问题是您在注册客户端时总是需要使用您用来设置c2dm的帐户。

您需要确保客户端手机在手机上有一个活跃的Google帐户(无关紧要),但是当您注册时,您需要使用您用于注册该应用的帐户。我认为它被用作某种类型的标识符,以了解哪个服务器应该能够向应用程序发送通知。可能是Google从上下文中检索到手机的标识符。您的应用程序(可能是本地有效的Google帐户)应创建服务器电话的标识符。

答案 4 :(得分:0)

假设您已通过电子邮件“foo@foo.com”注册了C2DM。

随后,您在应用程序中请求注册ID。您之所以只能将推送通知发送到与'foo@foo.com'相关联的注册ID,是因为您应该仅使用您的电子邮件地址请求注册ID 在您注册C2DM时提供。

这会解决您的疑问吗?