【问题标题】:When sending messages using GCM, I keep getting the response 'MismatchSenderId' [duplicate]使用 GCM 发送消息时,我不断收到响应“MismatchSenderId”[重复]
【发布时间】:2012-07-03 16:40:22
【问题描述】:

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

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

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

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

【问题讨论】:

标签: google-cloud-messaging


【解决方案1】:

请从设备上卸载您的 Android 应用并重新运行该应用

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

【讨论】:

  • 我的好答案 +1。
  • 一旦我的 ID 全部正确,它仍然无法正常工作。这个解决方案对我有用。 +1
  • 在浪费了大约 2 个小时并在 Google API 上创建了一个新项目之后,这是我应该早点尝试的解决方案。我从来没有想过这一点,并且可能会浪费更多的时间来试图弄清楚为什么我的 GCM 无法正常工作。有时,缺乏来自 Google 的指导和文档会让生活变得非常困难。
  • 这不是给我一个新 ID。
【解决方案2】:

查看 Stack Overflow 帖子Why do I get "MismatchSenderId" from GCM server side?

从上面的网址:

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

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

xxxxxxxxx 是项目 ID,即发送者 ID。

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

【讨论】:

  • 对不起,这个答案不正确。使用标记为浏览器的 API 密钥。由于某种原因,受 IP 限制的那些目前无法正常工作(我正在开发中)。
  • 实际上,服务器密钥在这里可以正常工作。我是 PushSharp 的作者,我已经成功使用服务器应用程序的密钥,但是我已经编辑了我的答案,建议在服务器密钥不起作用时尝试两者。
  • 其实 Redth,这是个好主意。显然使用服务器特定的密钥更安全,但我已经为几个不同的服务器生成了一个,没有任何运气。
  • 您应该使用“项目编号”(即数字 ID)作为发件人 ID,而不是“项目 ID”。
【解决方案3】:

登录Google Cloud Console

参见附图中的示例:

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      这个错误肯定是因为您在注册设备时指定了错误的 SenderID:

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

      POST https://android.clients.google.com/c2dm/register3 HTTP/1.1 主机: android.clients.google.com 连接:保持活动内容长度:83 授权:AidLogin 51734556544354357:9087138434543543508 内容类型:application/x-www-form-urlencoded 用户代理: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 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。

      更多信息:

      【讨论】:

      • 第一个值是辅助登录中的设备 ID,但第二个值是什么?
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 这不起作用...当我使用项目 ID 时,尝试注册时收到 INVALID_SENDER。当我使用与 api 控制台项目关联的电子邮件地址时,它注册成功,但我仍然收到 MismatchSenderID 错误...
        • 查看此链接stackoverflow.com/questions/11242743/… 我已使用浏览器 api 密钥,它在我的情况下工作正常。
        【解决方案8】:

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

        【讨论】:

        • 登录console.developers.google.com,搜索项目(如果你创建了多个项目;或者选择唯一一个),检查项目号是否与你所在的项目号相同在您的应用程序中使用。我的问题是我在谷歌开发者控制台中创建了多个项目..
        【解决方案9】:

        请注意,如果您的发件人 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 的那个。在此处遵循一般准则: General client-side implementation guidelines

        【讨论】:

          【解决方案10】:

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

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

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

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

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

          【讨论】:

            【解决方案11】:

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

            C2DM 和 GCM 不可互操作。例如,您不能发布 从 GCM 到 C2DM 注册 ID 的通知,您也不能使用 C2DM 注册 ID 作为 GCM 注册 ID。从您的服务器端 申请时,您必须跟踪注册 ID 是否来自 C2DM 或 GCM 并使用正确的端点。

            当您从 C2DM 过渡到 GCM 时,您的服务器需要注意 给定的注册 ID 是否包含旧的 C2DM 发件人或新的 GCM 项目编号。这是我们推荐的方法:拥有新的 应用程序版本(使用 GCM 的版本)随 注册标识。这个位告诉你的服务器这个注册 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 获取“服务器 API 密钥”和 “发件人ID”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-06-20
              • 2012-12-16
              • 1970-01-01
              • 1970-01-01
              • 2012-10-27
              • 1970-01-01
              相关资源
              最近更新 更多