为什么我从GCM服务器端收到“MismatchSenderId”错误信息?

77

我正在尝试为我的Android应用程序创建一个推送服务,并且我遵循了Google GCM的文档和示例:

我可以注册/注销我的Android应用程序。从服务器端,我可以看到我已经注册了一项订阅,但是当我尝试从服务器向我的Android应用程序发送消息时,我总是会收到以下错误:

发送消息到设备#0时出错:MismatchSenderId

对于我的Android应用程序,我使用SENDER_ID=200000000001。

对于我的服务器端,如Google所说,我使用API_KEY=AIzxxxxxxxxxxxxxxxxXxxXxxXxxxXXXXXxxxxs。

我按照这个文档进行操作:

http://developer.android.com/guide/google/gcm/demo.html

我也在我的Google API面板中启用了GCM,但我仍然会收到这个烦人的错误消息。

我该如何解决这个问题?


检查 manifest.json 文件以获取 GCM 发送者 ID。 - Shivappa
11个回答

68

你的服务器是否使用GCM服务器返回给你应用程序的新注册ID?如果你尝试向由旧的C2DM服务器分配的注册ID发送消息,则可能会遇到此问题。

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

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

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

请确保API密钥属于“服务器应用程序密钥(带有IP锁定)”。


3
你看过GCM的架构概述了吗?http://developer.android.com/guide/google/gcm/gcm.html?每一部使用你的App 的 Android 手机都会使用你的应用程序 Sender ID 注册 GCM,并且他们将收到一个唯一的 GCM 注册 ID,你需要在服务器上存储它。如果你想向所有用户发送消息,则需要遍历所有这些注册 ID。 - azgolfer
7
这很傻,但有效。仪表板页面上列出的项目ID是我选择的名称ID,但您必须使用URL中的数字ID,这非常令人困惑。 - Redth
2
找到这个答案花了我很长时间,@azgolfer 你是传奇。大家一定要仔细检查自己的新注册ID!这对我有用。 - SergioM
5
这份信息可能已过时。现在您应该使用您的项目编号。 - Ethan Fischer
我有同样的问题:http://stackoverflow.com/questions/35812304/pushnotification-not-working-properly - albert
显示剩余5条评论

24
当您不使用数字 ID 时,会发生不匹配。项目 ID 不是发送者 ID!我花了九个小时才明白这一点。为了消除由 Google 引起的所有困惑,请访问以下链接以获取数字 ID:https://console.cloud.google.com,而不是 https://console.developers.google.com。希望这有所帮助!
更新: 事情又变了。现在发送者 ID 在 Firebase 中。
前往https://console.firebase.google.com并选择您的项目。在设置->云消息下,您可以找到发送者 ID。
它可以工作!

哦天啊!你的帖子让我省了好几个小时...谢谢! - Peter Moskala

8
请在您的终端中运行以下脚本。
curl -X POST \
-H "Authorization: key=  write here api_key" \
-H "Content-Type: application/json" \
-d '{ 
"registration_ids": [ 
"write here reg_id generated by gcm"
], 
"data": { 
"message": "Manual push notification from Rajkumar"
},
"priority": "high"
}' \
https://android.googleapis.com/gcm/send

它会在成功或失败时发送消息。


6
由于您在同一设备上使用不同的密钥登录,因此出现了"MismatchSenderId"错误。要解决此问题,请卸载应用程序并重新运行,更新注册密钥。然后,在终端中运行我发布的CURL脚本,它将给出成功消息,并将通知发送到您的设备。 - Raj Kumar

4

最近我遇到了同样的问题,尝试使用不同的值来设置 "gcm_sender_id" ,但是必须将 "gcm_sender_id" 设置为“项目编号”。

您可以在以下位置找到此值:菜单 > IAM 和管理 > 设置。

查看截图:GCM 项目编号


3
当HTTP请求中的服务器密钥发送者ID参数不匹配时,就会发生这种情况。基本上,服务器ID和服务器密钥必须属于同一个Firebase项目。请参考下面的图片。如果混合来自不同Firebase项目的这些参数,则会导致MismatchSenderId错误。 enter image description here

2
InstanceID.getInstance(getApplicationContext()).getToken(authorizedEntity,scope)

authorizedEntity 是服务器的项目编号


2

您的安卓应用需要纠正12位数字ID(也称为GCM项目编号)。如果这个12位数字不正确,那么您也会遇到这个错误。

这个12位数字可以在您的Google Play控制台中找到,该控制台位于特定应用程序下,'Service & API' -> 'LINKED SENDER IDS'。


0

检查您的Android项目中app文件夹中的google-services.json文件。如果不确定,请从Firebase控制台生成一个新的。我在两种情况下遇到了这个错误。

  1. 我使用了一个测试Firebase项目和测试应用程序(包含正确的google-services.json文件)。然后我尝试向另一个应用程序发送推送通知,但出现了此错误(““error”:“MismatchSenderId””)。我明白第二个应用程序绑定到另一个具有不同google-services.json的Firebase项目。由于服务器密钥不同,请求应被重写。

  2. 我更改了应用程序中的google-services.json,因为我想用实际的Firebase项目替换测试项目。我生成了正确的google-services.json文件,更改了请求,但仍然收到此错误。第二天它自己解决了。我怀疑Firebase不会同步更新。

要获取请求的服务器密钥,请打开https://console.firebase.google.com并选择适当的项目。

enter image description here

然后将其粘贴到请求中。

enter image description here


0

随着GCM的弃用和其API的移除,如果您在2019年5月29日之后尝试使用GCM,则可能会看到MismatchSenderId。有关更多详细信息,请参见Google GCM和FCM FAQ


-1

如果用于本地Android,请检查您的AndroidMaifest.xml文件:

<meta-data
        android:name="onesignal_google_project_number"
        android:value="str:1234567890" />  
  <!--             its is correct. -->

而不是

   <meta-data
        android:name="onesignal_google_project_number"
        android:value="@string/google_project_number" />

希望能对你有所帮助!


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