5

我正在使用 Google Cloud Messaging (GCM) 处理推送通知。我可以按照本教程设置服务器和客户端。

该服务器在 Apache Tomcat6.0 (localhost) 和 Google APIs(API 级别 17)上的 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 密钥几乎不会更新。发现这个错误真是一场噩梦。感谢大家的投入!

4

3 回答 3

2

我建议您阅读 GCM 指南:

适用于 Android 的 GCM 指南

发件人 ID 是一个常量,将用于 GCM 和您的服务器之间的通信。当您的手机注册到他的服务时,regsitratiomID (regID) 由 GCM 服务管理。

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

发件人ID:

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

注册号:

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

于 2013-03-01T12:56:03.133 回答
2

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

  1. 授权标头丢失或语法无效。
  2. 作为密钥发送的项目编号无效。
  3. 密钥有效但 GCM 服务已禁用。
  4. 请求来自未在服务器密钥 IP 中列入白名单的服务器。

检查您在 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 时发生。

于 2013-07-26T07:59:36.703 回答
0

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

注册号

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

诊断注册ID是否成功与服务器共享(Get/Post),除非您不会收到任何消息。

于 2013-03-01T12:52:12.200 回答