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

时间:2013-03-01 12:06:13

标签: android android-emulator google-cloud-messaging

我正在使用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密钥几乎​​不会更新。发现这个虫子真是一场噩梦。感谢大家的投入!

3 个答案:

答案 0 :(得分:2)

我建议你阅读GCM指南:

GCM guide for Android

发件人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)

您尝试用来发送邮件的发件人帐户无法通过身份验证。可能的原因是:

  1. 缺少授权标头或语法无效。
  2. 作为密钥发送的项目编号无效。
  3. 密钥有效但GCM服务已停用。
  4. 请求来自服务器密钥中未列入白名单的服务器 的IP。
  5. 检查您在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是否与服务器成功共享(获取/发布),除非您没有收到任何消息。