我正在使用GCM实现推送通知服务器。我发送的帖子请求包含我从Google API控制台获得的发件人ID(应用程序密钥),以及我从GCM服务获得的注册ID。
发布的JSON包含一个注册ID。我总是得到同样的答复:
{
"multicast_id":8546528660791862014,
"success":0,
"failure":1,
"canonical_ids":0,
"results":[
{
"error":"MismatchSenderId"
}
]
}
可能是什么问题?我做错了什么?
答案 0 :(得分:33)
请从设备上卸载Android应用并再次运行该应用。
现在您将获得新的注册ID。这可能会解决特定情况下的MismatchSenderId问题(有时会发生更改/刷新API密钥,但仍使用旧的注册密钥)。在我的情况下,我首先获得了我的设备的注册ID,然后我更改了我的API密钥(在Google GCM服务器上),然后我收到了MismatchSenderId错误。最后,我从设备上卸载了我的Android应用程序,问题就解决了。
答案 1 :(得分:23)
请参阅堆叠溢出帖子 Why do I get "MismatchSenderId" from GCM server side? 。
来自上面的网址:
仔细检查发件人ID和API_KEY,它们必须匹配,否则您将收到MismatchSenderId错误。在Google API控制台中,查看项目的网址:
https://code.google.com/apis/console/#project:xxxxxxxxxxx
xxxxxxxxx是项目ID,即发件人ID。
有些人使用“Key for Server Apps”类型的密钥报告问题,但使用“浏览器密钥”类型取得了成功。就个人而言,服务器密钥类型适用于我,但尝试两者,YMMV。
答案 2 :(得分:8)
答案 3 :(得分:5)
您应该使用"项目编号"发件人ID的(即数字ID),而不是"项目ID"
答案 4 :(得分:2)
这个错误肯定是因为您在注册设备时指定了错误的SenderID:
以下是注册请求(fiddler)的示例
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,如 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
应用程式= gpYOURAppHereloin&安培;设备= 5112132132137117&安培;寄件人= <强> YourApplicationIDHere 强>
您可以通过以下步骤找到您的SenderID
更多信息:
答案 5 :(得分:2)
我正在复制tutorial的代码,但忘记更改源代码中的项目编号。它正在为教程作者的项目而不是我的项目生成ID,因此请检查您是否在Android应用上更改了源代码!
答案 6 :(得分:0)
从API控制台生成API密钥。在后端使用浏览器应用程序密钥,并使用项目ID作为客户端代码中的发件人ID。
答案 7 :(得分:0)
我有同样的问题,但我做了一个愚蠢的事:我在谷歌控制台有多个项目,我为项目编号属于一个项目生成了注册ID,我试图向Api密钥发送通知属于另一个项目。 此错误的第一步是检查项目是否正常工作。
答案 8 :(得分: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商店,让用户下载更新并让此版本在首次执行时完成工作,尽管这不会计算因某些原因无法更新的应用程序。 / p>
最重要的是,如果您要在首选项或数据库中存储注册ID,请不要忘记在应用程序更新时刷新其值,因为更新可能意味着id重新生成,而且可能是您的代码而不是GCM是错误地缓存先前ID的那个。请遵循以下一般准则: General client-side implementation guidelines
答案 9 :(得分:0)
当我在测试https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/GcmEndpoints中找到的Google示例代码时,我遇到了类似的问题,XYZ所说的内容确实帮助我解决了这个问题。
我能够通过messaging.messagingEndpoint.sendMessage方法从我的谷歌应用引擎API资源管理器中将消息发送到我的手机,但是在谷歌应用引擎控制台日志中,它总是说MismatchSenderId。错误记录的时候,显然不存在错误错误。
我真的很困惑,这就是我设法解决这个问题的方法:
重试发送邮件,这次它应该可以正常工作,而不会在Google应用引擎控制台日志中记录错误。
答案 10 :(得分: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获取&#34;服务器API密钥&#34;和 &#34;发件人ID&#34;。