我正在使用Google Cloud Messaging(GCM)处理推送通知。我能够在this tutorial之后设置服务器端和客户端。
服务器在Apache Tomcat6.0(localhost)上运行,在Android API上运行Android模拟器(API级别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不同;看起来像是一个编码的。
任何突破?
修改
问题终于解决了! Ant没有正确构建WAR文件。因此API密钥几乎不会更新。发现这个虫子真是一场噩梦。感谢大家的投入!
答案 0 :(得分:2)
我建议你阅读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应用程序绑定。
答案 1 :(得分:2)
您尝试用来发送邮件的发件人帐户无法通过身份验证。可能的原因是:
检查您在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时发生。
答案 2 :(得分:0)
发件人ID是您在Google控制台下创建的项目编号。
注册ID
当您的应用程序注册到GCM时,它会获得注册ID。为了传递消息,GCM将使用此注册ID来识别您的设备+您的应用程序。 您的Android应用程序应该将此注册ID发送到您的服务器,以便当服务器想要向您发送消息时,它可以使用注册ID对其进行标记,因此GCM可以将其发送到正确的设备&正确的应用程序。
诊断注册ID是否与服务器成功共享(获取/发布),除非您没有收到任何消息。