连接到在本地服务器上运行的GCM服务器
我正在使用Google Cloud Messaging(GCM)推送通知。我可以在this tutorial之后设置服务器和客户端。连接到在本地服务器上运行的GCM服务器
服务器在Google API(API级别17)上的Apache Tomcat6.0(localhost)和Android仿真器上运行。我有一个发件人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不一样;看起来像一个编码的。
任何突破?
编辑
问题终于解决了! Ant没有正确构建WAR文件。所以API密钥很难得到更新。发现错误是一场噩梦。感谢所有的投入!
我建议你阅读GCM指南:
发件人ID是要在GCM和服务器之间的交际中使用的常数。 regsitratiomID(regID)由您的电话注册到他的服务时由GCM服务管理。
一个更好的定义: http://developer.android.com/google/gcm/gcm.html
发件人ID:
您从API控制台获取,如入门描述的项目数量。发件人ID在注册过程中用于识别允许向设备发送消息的Android应用程序。
注册ID:
由GCM服务器发布给Android应用程序,允许它接收消息的ID。一旦Android应用程序具有注册ID,它就会将其发送到第三方应用程序服务器,该服务器使用它来标识每个已注册接收给定Android应用程序消息的设备。换句话说,注册ID绑定到特定设备上运行的特定Android应用程序。
发件人ID是您在Google控制台下创建的项目编号。
注册ID
当你的应用程序寄存器的GCM它获得的注册ID。要发送消息,GCM将使用此注册ID来识别您的设备+您的应用程序。 您的Android应用程序应将此注册ID发送到您的服务器,以便当服务器想要向您发送消息时,它可以使用注册ID对其进行标记,因此GCM可以将其发送到正确的设备&右侧的应用程序。
诊断注册ID是否与服务器(Get/Post)成功共享,除非您不会收到任何消息。
您尝试用来发送邮件的发件人帐户无法通过验证。可能的原因有:
- 授权标题丢失或语法无效。
- 作为关键字发送的项目编号无效。
- 密钥有效,但禁用了GCM服务。
- 源自服务器密钥 IP中未列入白名单的服务器的请求。
检查您在授权标头内发送的令牌是否与您的项目关联的正确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的有效性,您可以通过注册ID替换“ABC”这样做的。 当HTTP状态码为401时会发生。
我有一个类似的问题/新的后端。奇怪的部分是卷曲作品,但自动生成的测试页面/相同的api_key在发送GCM消息时会出现401错误。迷惑:-P – kenyee 2013-11-27 03:31:03
仿真程序无法正常工作。请尝试与设备 – 2013-03-01 12:26:14
对设备API级别进行任何限制..? – Renjith 2013-03-01 12:30:51
以上工作2.2 – 2013-03-01 12:31:59