连接到运行在本地服务器上的GCM服务器。

5
我正在处理与Google Cloud Messaging(GCM)相关的推送通知。 我能够按照这个教程设置服务器和客户端。
服务器运行在Apache Tomcat6.0(localhost)上,Android模拟器运行在Google APIs(API level 17)上。 我有一个发送者ID和API密钥。 当从模拟器运行时,我得到了一个成功的设备连接消息。 但在发送消息后不久,就会出现以下错误。
com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 401()
com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:211)
com.google.android.gcm.server.Sender.send(Sender.java:125)
com.google.android.gcm.demo.server.SendAllMessagesServlet.doPost(SendAllMessagesServlet.java:83)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

从其他帖子中,我了解到错误的API密钥是罪魁祸首。但在我的情况下,我确保使用了来自API控制台的正确密钥。

顺便说一句,当我运行模拟器时,我看到了一条消息“将regId发送到服务器”。注册ID是什么?它与发送者ID不同;看起来像是编码过的ID。

有任何突破吗?

编辑

问题最终得到解决!Ant没有正确构建WAR文件。因此,API密钥几乎不会更新。找出这个bug真的很困难。感谢所有人的帮助!


模拟器无法工作。请尝试使用设备。 - Sanket Pandya
设备 API 级别有任何限制吗? - Renjith
它在2.2以上工作。 - Sanket Pandya
在Android 2.2上尝试过了!仍然出现同样的错误! - Renjith
1
@SanketPandya GCM可以在带Google API的模拟器上运行。我尝试过API级别17。 - Renjith
3个回答

2
您正在尝试使用的发件人账户未通过身份验证。可能的原因如下:
  1. 缺少授权标头或授权标头语法无效。
  2. 发送的项目编号无效。
  3. 密钥有效,但GCM服务已禁用。
  4. 请求来自未在Server Key IPs中列入白名单的服务器。
请检查您在Authorization标头中发送的令牌是否为与您的项目相关联的正确API密钥。您可以通过运行以下命令来检查API密钥的有效性:
 api_key=YOUR_API_KEY

 curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_ids\":[\"ABC\"]}"

如果您想确认注册ID的有效性,可以通过将“ABC”替换为注册ID来进行确认。当HTTP状态码为401时会出现此情况。


我遇到了一个类似的问题,是在一个新的后端上。奇怪的是curl可以工作,但是使用相同api_key自动生成的测试页面在发送GCM消息时会出现401错误。这很令人困惑。:-P - kenyee

2

我建议您阅读GCM指南:

Android GCM指南

发送者ID是在GCM和您的服务器之间通信时将要使用的常量。注册ID(regID)由GCM服务在您的手机注册其服务时进行管理。

更好的定义: http://developer.android.com/google/gcm/gcm.html

发送者ID:

从API控制台获取的项目编号,如入门所述。 发送者ID在注册过程中用于识别被允许向设备发送消息的Android应用程序。

注册ID:

GCM服务器发放给Android应用程序的ID,允许它接收消息。 一旦Android应用程序获得了注册ID,它会将其发送到第三方应用程序服务器,后者使用它来识别已注册以接收给定Android应用程序的消息的每个设备。 换句话说,注册ID与在特定设备上运行的特定Android应用程序相关联。


0

发送者ID是您在Google控制台下创建的项目编号。

注册ID

当您的应用程序注册到GCM时,它会获得注册ID。为了传递消息,GCM将使用此注册ID来识别您的设备+您的应用程序。 您的Android应用程序应将此注册ID发送到您的服务器,以便当服务器想要向您发送消息时,可以使用注册ID标记它,因此GCM可以将其传递到正确的设备和正确的应用程序。

诊断注册ID是否成功与服务器共享(Get/Post),否则您将无法接收任何消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接