27

我正在使用 GCM 实现推送通知服务器。我使用从 Google API 控制台获得的发件人 ID(应用程序密钥)和从 GCM 服务获得的注册 ID 发送发布请求。

发布的 JSON 包含一个注册 ID。我总是得到相同的回应:

{
  "multicast_id":8546528660791862014,
  "success":0,
  "failure":1,
  "canonical_ids":0,
  "results":[
    {
      "error":"MismatchSenderId"
    }
  ]
}

可能是什么问题?我究竟做错了什么?

4

11 回答 11

33

请从设备上卸载您的 Android 应用程序并再次运行该应用程序

现在您将获得一个新的注册 ID。这可能会在特定情况下解决您的 MismatchSenderId 问题(如果您更改/刷新API密钥,但仍使用旧的注册密钥,有时会发生这种情况)。就我而言,我首先获得了设备的注册 ID,然后我更改了我的 API 密钥(在 Google GCM 服务器上),然后我得到了 MismatchSenderId 错误。最后,我从设备上卸载了我的 Android 应用程序,问题得到了解决。

于 2012-08-07T13:13:36.390 回答
23

请参阅 Stack Overflow 帖子为什么我会从 GCM 服务器端获得“MismatchSenderId”?.

从上面的网址:

仔细检查发件人 ID 和 API_KEY,它们必须匹配,否则您将收到 MismatchSenderId 错误。在 Google API Console 中,查看你的项目的 URL:

https://code.google.com/apis/console/#project:xxxxxxxxxxx

xxxxxxxxx 是项目 ID,即发件人 ID。

有些人使用“服务器应用程序密钥”类型的密钥报告问题,但使用浏览器密钥类型成功。就我个人而言,服务器密钥类型适用于我,但请尝试两者,YMMV。

于 2012-07-03T17:50:04.680 回答
8

登录谷歌云控制台

请参见附图中的示例:

在此处输入图像描述

于 2013-12-25T15:02:01.627 回答
5

您应该使用“项目编号”(即数字 ID)作为发件人 ID,而不是“项目 ID”

于 2014-10-28T00:00:44.083 回答
2

肯定会出现此错误,因为您在注册设备时指定了错误的 SenderID:

这是注册请求的示例(提琴手)

POST https://android.clients.google.com/c2dm/register3 HTTP/1.1 主机:android.clients.google.com 连接:keep-alive 内容长度:83 授权:AidLogin 51734556544354357:9087138434543543508 内容类型:application/ x-www-form-urlencoded 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36 Accept-Encoding: gzip, deflate Accept-Language: en -US,en;q=0.8,ar;q=0.6,fr;q=0.4

app=gpYOURAppHereloin&device=5112132132137117&sender= YourApplicationIDHere

您可以通过以下步骤找到您的 SenderID

  1. 打开谷歌开发者控制台。
  2. 出现一个页面,显示您的项目 ID 和项目编号。例如,项目编号:67023432432。复制您的项目编号并将其用作 GCM 发件人 ID。

更多信息:

于 2015-01-21T16:40:08.560 回答
2

我正在从教程中复制代码,但忘记更改源代码中的项目编号。它正在为教程作者的项目而不是我的项目生成 ID,因此请检查您是否更改了 Android 应用程序上的源代码!

于 2015-01-24T06:20:59.970 回答
0

从 API 控制台生成 API 密钥。在后端使用浏览器应用程序密钥,并在您的客户端代码中使用项目 ID 作为发件人 ID。

于 2012-07-03T09:51:34.343 回答
0

我有同样的问题,但我做了一件愚蠢的蠢事:我在谷歌控制台中有多个项目,我为属于一个项目的项目号生成了注册 ID,我试图向属于另一个项目的 Api 密钥发送通知项目。出现此错误的第一步是检查您工作的项目。

于 2014-10-02T20:54:55.237 回答
0

请注意,如果您的发件人 ID 更改,Google Play 服务的com.google.android.gms.gcm.GoogleCloudMessaging.register()方法将继续返回原始注册 ID,而不管新的发件人 ID 是什么。您需要为 Google Play 服务调用同一个类的 unregister() 方法来刷新和清除以前过时的缓存值。

在此处查看 API 信息:com.google.android.gms.gcm.GoogleCloudMessaging.register()

作为替代方案,您始终可以删除应用程序的数据或卸载重新安装,如先前的答案中所述,但这在生产环境中远不能接受。

如果您更改了 GCM 设置和发件人 ID,应用程序必须知道它们需要取消注册并重新注册到 GCM。实现此目的的一个简单方法是将新版本推送到 Play 商店,让用户下载更新并让此版本在第一次执行时完成工作,尽管这不会计算由于某种原因未更新的应用程序。

最重要的是,如果您将注册 ID 存储在首选项或数据库中,请不要忘记在应用程序更新时刷新其值,因为更新可能意味着重新生成 ID,并且可能是您的代码而不是 GCM 是一个错误地缓存以前的ID。在此处遵循一般指南: 一般客户端实施指南

于 2014-12-15T18:52:44.470 回答
0

当我测试在这里找到的 Google 示例代码时遇到了类似的问题 https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/GcmEndpoints和 XYZ 所说的确实帮助我解决了这个问题。

我能够在 messing.messagingEndpoint.sendMessage 方法下从我的谷歌应用引擎 API Explorer 将消息发送到我的手机,但是在谷歌应用引擎控制台日志中,它总是显示 MismatchSenderId。显然不应该有错误时记录的错误困扰着我。

不匹配发件人 ID

我真的很困惑,这是我设法解决这个问题的方法:

  1. 从您的手机中卸载您的安卓应用程序。
  2. 重新安装您的 android 应用程序并记下 reg ID。
  3. 进入服务 > 注册 API v1 > registration.listDevices 下的 API 资源管理器并列出 GCM 的所有 RegID。
  4. 将此列表复制到某处 - 到记事本。
  5. 转到服务 > 注册 API v1 > registration.unregister 下的 API 资源管理器,并取消注册与您的应用程序使用的不匹配的所有 regID。

重试发送消息,这一次它应该可以正常工作,而不会在谷歌应用引擎控制台日志中记录错误。

于 2015-01-03T17:46:37.383 回答
0

您需要检查您的注册 ID 的来源,您不能在 GCM 消息帖子中使用 C2DM 注册 ID。来自谷歌的文档:

C2DM 和 GCM 不可互操作。例如,您不能将通知从 GCM 发布到 C2DM 注册 ID,也不能将 C2DM 注册 ID 用作 GCM 注册 ID。在您的服务器端应用程序中,您必须跟踪注册 ID 是来自 C2DM 还是 GCM 并使用正确的端点。

当您从 C2DM 过渡到 GCM 时,您的服务器需要知道给定的注册 ID 是否包含旧的 C2DM 发件人或新的 GCM 项目编号。这是我们推荐的方法:让新的应用程序版本(使用 GCM 的应用程序版本)连同注册 ID 一起发送。这个位告诉你的服务器这个注册 ID 是为 GCM 准备的。如果您没有获得额外的位,则将注册 ID 标记为 C2DM。一旦不再有有效的注册 ID 被标记为 C2DM,您就可以完成迁移。

另外需要注意的是SENDER_ID,如果使用InstanceID获取RegistrationID,SENDER_ID的格式是数字,比如

    InstanceID instanceID = InstanceID.getInstance(this);
    String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

SENDER_ID 无法使用项目名称,请使用https://developers.google.com/mobile/add获取“Server API Key”和“Sender ID”。

于 2015-10-16T16:18:06.750 回答