我有一个使用Google FCM发送推送通知的应用程序。
当我向一组用户发送推送通知时,我会收到一些MismatchSenderId
的回复。尽管如此,所有用户都拥有完全相同的应用程序。一些用户如何获得成功响应而其他用户获得MismatchSenderId?
我已经研究了很多,并确保我已经添加了FCM所需的所有先决条件。
有什么建议吗?
修改
示例回复:
{"multicast_id":5340432438815499122,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
编辑2:
这是服务器端发送代码(PHP):
$fields = array
(
'to' => $token,
'data' => $data
);
$headers = array
(
'Authorization: key=AIza**************************',
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, true );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode($fields) );
curl_exec( $ch );
curl_close( $ch );
更新
似乎已通过SDK更新解决了该问题。我现在正在使用最新的com.google.firebase:firebase-messaging:9.6.1
,我没有得到" MismatchSenderId"了。
答案 0 :(得分:28)
答案 1 :(得分:15)
我遇到了同样的问题。花了几个小时才弄明白,我发现了这个解决方案:
希望这会对你有所帮助。感谢
答案 2 :(得分:6)
就我而言,我只是在误解项目凭证:从一个项目使用google-services.json,从另一个项目使用服务器密钥。
答案 3 :(得分:6)
这对我有用:
我正在使用另一个Firebase项目(例如Project 2)中的Server key。我使用与链接到我的android项目(说Project 1)相同的服务器密钥,它起作用了。以我的经验,为一个完整的android项目使用一个firebase应用似乎可以解决问题。
答案 4 :(得分:4)
什么对我有用:
我发现senderId与FCM控制台中的项目编号不同
所以我重新下载了google-services.json,一切正常
答案 5 :(得分:4)
如下所示,通过输入正确的密钥解决了我的问题。
身体是行就像这张图片
答案 6 :(得分:3)
我交叉验证了所有凭据
添加了新的服务器密钥,并删除了旧的服务器密钥
再次下载了google-services.json
什么都没解决
然后我只需要清理项目,然后重新生成项目即可。
答案 7 :(得分:2)
确保从应用中删除所有Parse代码(AndroidManifest中的库,接收器等)。我发现间歇性推送通知无法正常工作。从我的观察,它将适用于全新安装,但不适用于Play商店的应用更新。
我认为Parse内部的东西与FCM相冲突(Parse使用GCM,因此我猜测它与同时使用GCM和FCM有关)。一旦我撕掉所有Parse接收器和库,事情就会很好。
答案 8 :(得分:2)
我在这上面花了几个小时,终于弄明白了。如果您的发送方应用程序使用的服务帐户与接收方使用的服务帐户不同,则会出现此问题。
您可以通过 Firebase -> Project Overview -> Project Settings -> Service Accounts
找到您的接收方服务帐户并生成一个新密钥并在您在发送方中初始化 FirebaseApp
时使用该密钥:
FileInputStream serviceAccount = new FileInputStream("YOUR_PATH_TO_GENERATED_KEY.json");
GoogleCredentials googleCredentials = GoogleCredentials.fromStream(serviceAccount);
FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(googleCredentials).build();
firebaseApp = FirebaseApp.initializeApp(options);
这个初始化需要在你发送推送通知之前完成一次。
就我而言,我已正确完成所有操作,但仍然遇到此问题。我对接收器应用程序中使用的“google-services.json”做了一些更改,我注意到 AndroidStudio 没有使用我的新文件。解决办法很简单:
AndroidStudio -> Build -> Clean Project
和构建 -> Rebuild Project
答案 9 :(得分:1)
我们花费了数小时来解决此问题。我们发现令牌是使用不同的FCM帐户设置(google-services.json)生成的,而通知是使用其他FCM帐户设置的。 当我们同步两者时,它就像是一种魅力。
答案 10 :(得分:1)
检查manifest.json中的 gcm_sender_id 如果不匹配 - 正确,但您需要为新发件人ID创建新订阅者。 存在用户中断。
答案 11 :(得分:1)
根据回复" MismatchSenderId",这是FireBase与您当地" google-services.json"之间的不匹配,您必须确保两个清单匹配
在FireBase控制台中,您转到" YourProject> Project OverView>云消息"你会看到" SenderID"必须与" google-services.json"匹配在你的Android项目中。
你能做的最好的事情是从" General"下载最终的json文件。选项卡并将其放在项目中。
答案 12 :(得分:1)
尝试发送推送通知时遇到了同样的错误。获取更新的google-services.json文件并替换为该文件。为我工作。
答案 13 :(得分:1)
实际上这个问题有很多原因。 我的原因是传递了无效令牌。 我传递了从一个应用生成的相同令牌,并在另一个应用中使用相同的令牌。 更新令牌后,它对我有用。
答案 14 :(得分:0)
就我而言,有人在Apple开发门户网站中为我的应用删除了APN SSL证书。
这解决了问题。
答案 15 :(得分:0)
为消除此错误,请注意fcm中发送方ID不匹配的错误
{"multicast_id":7751536172966571167,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
发生错误
因此我们首先需要在FCM中注册应用程序,例如MyDemoApplication
此后,FCM将生成服务器密钥,即AIzaSyB9krC8mLHzO_TtECb5qg7NDZPxeG03jHU
和发件人ID,即346252831806
,如下所示。
在Android Studio中之后,我们的项目将连接到这些FCM创建的项目,即MyDemoApplication
最重要的步骤是需要设备令牌或注册ID。这些令牌必须在Android Studio中创建。
在Web API项目中使用发件人ID和API密钥之后,您肯定会收到通知
答案 16 :(得分:0)
仅供参考。即使我发誓我正在测试的android应用程序是使用最新/最伟大的google-services.json文件构建的,但是我仍可以从FCM控制台发送到该应用程序,但我还是遇到了此错误。
完成Clean Project
之后,我重新构建了应用程序,现在我可以使用其注册的FCM令牌将其发送到应用程序。因此,在将头部撞到墙上的时间过长之前,也许可以尝试进行一次干净的重建。
答案 17 :(得分:0)
就我而言,这非常简单。我从数据库中提取了错误的registrationId。当我提取正确的ID后,它就起作用了。
答案 18 :(得分:0)
在我的react-native-node.js项目中,我遇到了同样的问题。 我想在android中发送通知。 一切都已设置并且运行良好(即我能够从node.js发送通知并在Android设备上接收通知)。
几天后,我不得不使用另一个Firebase帐户,因此我更改了项目 android / app 文件夹中的google-services.json文件,并重建了该项目。但是,当我尝试再次从服务器发送通知时,出现错误-
{.............
errorInfo: {
code: 'messaging/mismatched-credential',
message: 'SenderId mismatch'
},
codePrefix: 'messaging'
}
解决方案:
该位置的XML文件- 根据新的 google服务, app / build / generate / res / google-services / {build_type} /values/values.xml 不会自动更新。 json 。 它仍然由我以前的 google-services.json 文件中的旧值组成。我不得不手动更改 values.xml 文件。
这是 app / build / generate / res / google-services / {build_type} /values/values.xml 文件的外观(如果文件没有自动更新,则需要手动进行更改)根据 google-services.json )-
<?xml version="1.0" encoding="utf-8"?>
<resources>
<! -- Present in all applications -->
<string name="google_app_id" translatable="false">1:1035469437089:android:73a4fb8297b2cd4f</string>
<! -- Present in applications with the appropriate services configured -->
<string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
<string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
<string name="ga_trackingId" translatable="false">UA-65557217-3</string>
<string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
<string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
<string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
<string name="project_id" translatable="false">mydemoapp</string>
</resources>
您可以参考以下链接:
答案 19 :(得分:0)
我试图使用邮递员的fcm api“ https://fcm.googleapis.com/fcm/send”发送通知。服务器密钥还可以,令牌粘贴得很好,但是仍然出现错误“ MismatchSenderId”。
然后在android端的gradle文件中引入了以下依赖性。
implementation platform('com.google.firebase:firebase-bom:25.12.0')
它开始在设备上接收通知
答案 20 :(得分:0)
我在我当前的应用程序中添加了更多的产品风味后出现了这个错误,
似乎它使用包名来生成 FCM 令牌,所以为了解决这个问题,我必须添加一个应用程序用于eatch Flavor 并使用它对应的 PackageName,并使用最新生成的包含客户端的文件更新 google-services.json
文件每种口味的信息(包装名称)。
答案 21 :(得分:0)
注意:我已经截断了FCM令牌的第一部分(在:
之前),错误是MismatchSenderId
修复了我的脚本,现在一切正常。
答案 22 :(得分:0)
弄清楚为什么我获得“ MismatchSenderId”状态有很大的麻烦。
我在根build.gradle
中添加了gms依赖关系,但实际上我的错误是未在应用build.gradle
中应用gms插件。
如果您的应用build.gradle
中没有此行,则可能是通知无法正常工作的原因:
apply plugin: 'com.google.gms.google-services'
也许这可以帮助某人 干杯
答案 23 :(得分:0)
我为此浪费了几天。
就我而言,我遵循此blog来使用Postman并获得mismatchsenderid错误。以前,我得到messaging/mismatched-credential
,有人报告说他们的客户端应用程序使用了多个项目。
但是,对我来说,我是一对一的,一个Web应用程序和一个项目。 但,我通过ng serve
将所有应用托管在默认端口4200上。因此,无论我开发的是哪个项目/应用对,我总是会使用以下方式从客户端网络应用中获取相同的令牌: AngularFireMessaging.requestToken
-该令牌始终是我在开发中首次运行Firebase应用程序时创建的令牌。
作为一种变通办法,我在不同的端口上启动了不同的应用程序/项目,并为各个项目获得了正确的令牌。
答案 24 :(得分:0)
您好,我注意到在GCM中创建设备ID时,您无法使用新的服务器密钥通过FCM发送推送消息,而必须使用旧的API密钥。
答案 25 :(得分:0)
您可能正在做什么,而我正在做什么。 GCM令牌与FCM不再相同。检查您是否提取了GCM令牌ID而不是FCM。只需覆盖FirebaseInstanceIdService并确保您获得正确的ID。我以为他们曾经是相同的,但现在不一样了。我登录了测试,看到了。在您这样做之后,还像其他人所说的那样安全地更新了google-services.json。
答案 26 :(得分:0)
对我来说问题是我在cordova中使用phonegap-plugin-push
,使用phonegap应用程序测试应用程序。
问题在于,由于某些原因,使用此插件,无论您拥有什么发件人ID,phonegap应用程序都会拦截它并返回虚拟注册密钥。
所以要使它工作(只要你的所有键都正确)是用其他方式测试程序,使用模拟器,或通过usb进行android模拟。你的钥匙就会匹配。
希望这可以节省一些时间。
答案 27 :(得分:0)
更新firebase初始化对我有用..
<script src="https://www.gstatic.com/firebasejs/4.6.2/firebase.js"></script>
<script>
// Initialize Firebase
// TODO: Replace with your project's customized code snippet
var config = {
apiKey: "<API_KEY>",
authDomain: "<PROJECT_ID>.firebaseapp.com",
databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
storageBucket: "<BUCKET>.appspot.com",
messagingSenderId: "<SENDER_ID>",
};
firebase.initializeApp(config);
</script>
答案 28 :(得分:0)
我遇到了同样的问题,我修好了这个问题:
...瞧
答案 29 :(得分:-3)
您将在firebase控制台console.firebase.google.com/project/project-XXXXXXXXXXXXX/settings/cloudmessaging的设置部分中找到类似 AIzaSyDiTEVq4Li1pj7IyraRlyRU9adc-49-KVY 的服务器密钥。
使用您的代码指定正确的密钥,然后重试。
答案 30 :(得分:-3)
我也得到了同样的错误。我复制了api_key并更改为google_services.json。之后,它适合我
"api_key": [
{
"current_key": "********************"
}
],
试试这个