使用GCM发送消息时,我一直收到“ MismatchSenderId”响应。

27

我正在使用GCM实现推送通知服务器。我发送了一个带有来自Google API控制台的发送者ID(应用程序密钥)和来自GCM服务的注册ID的POST请求。

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

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

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


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - albert
请查看此链接:https://dev59.com/InPYa4cB1Zd3GeqPl6xQ#36467305 - KishuDroid
11个回答

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

4
非常好的回答,我给你加一分。 - Antony
2
当我确认我的ID都是正确的时候,它仍然无法正常工作。这个解决方案对我很有帮助。+1 - Jacksonkr
2
浪费了大约2个小时并在Google Apis上创建了一个新项目后,这是我早该尝试的解决方案。我从未想过这一点,本来可能会浪费更多时间来弄清楚为什么我的GCM不起作用。有时候,缺乏来自Google的指导和文档会让生活变得非常困难。 - zeeshan
这并没有给我一个新的ID。 - Keavon
同样的问题 http://stackoverflow.com/questions/35812304/pushnotification-not-working-properly - albert

23

请参考Stack Overflow帖子为什么我从GCM服务器端收到“ MismatchSenderId”错误消息?

根据上面的URL:

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

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

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

有些人报告使用“ Server Apps”类型的密钥时出现问题,但使用“ 浏览器密钥”类型则成功。就我个人而言,“ Server Key”类型适用于我,但您可以尝试两种类型,因为每个人的情况略有不同。


1
抱歉,但这个答案是不正确的。请使用标记为浏览器的 API 密钥。由于某种原因,IP 受限制的密钥目前无法使用(我正在开发中)。 - Roger Thomas
实际上,服务器密钥在这里运行良好。我是PushSharp的作者,并且已成功地将该密钥用于服务器应用程序,但我已编辑了我的答案,建议如果服务器密钥不起作用,则尝试两者都使用。 - Redth
实际上,Redth,这是个好主意。显然使用服务器特定的密钥更安全,但我已经为几个不同的服务器生成了密钥,但完全没有成功。 - Roger Thomas
4
请使用“项目编号”(即数字ID),而非“项目ID”作为发件人ID。 - Paulius Liekis
你能帮忙解决http://stackoverflow.com/questions/35812304/pushnotification-not-working-properly这个问题吗? - albert

8

5
你应该使用“项目编号”(即数字ID)作为发送者ID,而不是“项目ID”。

2
这个错误肯定是因为您在注册设备时指定了错误的SenderID:
以下是一个注册请求的示例(fiddler):

POST https://android.clients.google.com/c2dm/register3 HTTP/1.1 Host: android.clients.google.com Connection: keep-alive Content-Length: 83 Authorization: AidLogin 51734556544354357:9087138434543543508 Content-Type: application/x-www-form-urlencoded User-Agent: 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=您的应用程序ID在此处

您可以按照以下步骤找到您的SenderID:
打开Google开发者控制台。一个页面会显示您的项目ID和项目编号。例如,项目编号:67023432432。请记录下您的项目编号并将其用作GCM发送者ID。
更多信息:
- 入门指南: http://developer.android.com/google/gcm/gs.html - 发送者不匹配错误: http://developer.android.com/google/gcm/http.html#Mismatched_Sender

1
第一个值是aidlogin中的设备ID,但第二个值是什么? - NotGI

2
我从教程中复制代码时忘记在源代码中更改项目编号。它正在为教程作者的项目生成ID而不是我的项目,所以请确保您在Android应用程序中更改源代码!

0

您需要检查您的注册ID来源,不能在GCM消息发布中使用C2DM注册ID。来自Google文档:

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 获取“服务器 API 密钥”和“发送方 ID”。


0
请注意,如果您的发件人ID更改了,则Google Play服务的com.google.android.gms.gcm.GoogleCloudMessaging.register()方法将始终返回原始注册ID,而不管新的发件人ID是什么。您需要调用同一类的unregister()方法来刷新Google Play服务并清除先前的旧缓存值。
在这里查看API信息:com.google.android.gms.gcm.GoogleCloudMessaging.register() 作为替代方案,您可以始终删除应用程序的数据或卸载-重新安装,如先前的答案中所述,但这远非在生产环境中可接受的做法。 如果您已更改了GCM设置和您的发件人ID,则应用程序必须知道它们需要注销并重新注册到GCM。一种简单的实现方法是向Play商店推送新版本,让用户下载更新,并在首次执行时让此版本执行该工作,尽管这不会计入某些由于某种原因而未进行更新的应用程序。
此外,如果您在首选项或数据库中存储注册ID,请不要忘记在应用程序更新时刷新其值,因为更新可能意味着ID重新生成,并且有可能是您的代码而不是GCM错误地缓存以前的ID。请遵循以下一般准则:一般客户端端实施准则

0

我曾经遇到过同样的问题,但是我犯了一个非常愚蠢的错误:我在Google控制台中有多个项目,我为一个项目编号生成了注册ID,然后尝试向属于另一个项目的API密钥发送通知。 解决这个错误的第一步是检查你正在使用的项目。


登录https://console.developers.google.com,在其中搜索项目(如果您创建了多个项目,则选择其中一个),并检查其项目编号是否与您在应用程序中使用的项目编号相同。我的问题是我在Google开发者控制台中创建了多个项目。 - Popa Andrei

0

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

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

MismatchSenderId

我曾经非常困惑,以下是我如何解决这个问题的方法:

  1. 从您的手机中卸载Android应用程序。
  2. 重新安装Android应用程序并记录Reg ID。
  3. 在服务下的API浏览器中,选择注册API v1和registration.listDevices,列出所有GCM的RegID。
  4. 将此列表复制到某个地方 - 到记事本。
  5. 在服务下的API浏览器中,选择注册API v1和registration.unregister,并注销所有与您的应用程序使用的RegID不匹配的RegID。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接