【发布时间】:2018-08-02 22:24:45
【问题描述】:
我认为我已完成将消息传递应用程序从 GCM 转换为 FCM 所需的所有步骤,但它无法正常工作。 FCM 目前正在返回 MismatchSenderId。
我的 AndroidManifest.xml 中定义了以下服务。
<service
android:name=".MyFcmListenerService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
当然,现在下面的监听器代码永远不会被执行,因为消息被拒绝了
public class MyFcmListenerService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage message)
{
String from = message.getFrom();
Map data = message.getData();
String debug = "what is in data?";
//todo Process incoming message here
}
instance Id 服务的代码如下。 . .
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService
{
private static final String TAG = "MyFirebaseIIDService";
@Override
public void onTokenRefresh() {
String regToken = FirebaseInstanceId.getInstance().getToken();
//store token in shared memory
SPHelper.setTempString(GlobalStuff.GCT, "fcmtoken", regToken);
}
}
我的 Firebase 控制台上的发件人 ID 与我的 google-services.json 中的项目编号匹配。它们都是相同的 12 位数字。我为控制台定义了两个变体:com.deanblakely.myapp 和 com.deanblakely.myapp.debug,这两个变体也包含在我的 json 文件中。
顺便说一句,完成所有工作后,我再次下载了 google-services.json 以确保它与我拥有的相同。不是。最新的 json 有这一行,但它对我的问题没有影响。
"storage_bucket": "optimal-xxxxxx-824.appspot.com"
以下 C# 代码在我的服务器上运行并执行 Post 到 FCM。除了 FCM URL 之外,这是我相同的 GCM 发布代码。 (“regid”实际上是目标手机的 FCM 令牌)。
private string FCMPostToPhone(string regid, string apiKey, string postData)
{
//This posts the message to Firebase Cloud Messaging (FCM)
string PostString = "{ \"registration_ids\": [ \"" + regid + "\" ], \"data\":" + postData + "}";
byte[] byteArray = Encoding.UTF8.GetBytes(PostString);
Logger.log("Post to FCM = " + PostString);
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://fcm.googleapis.com/fcm/send");
Request.Method = "POST";
Request.KeepAlive = false;
Request.ContentType = "application/json";
Request.Headers.Add(string.Format("Authorization: key={0}", apiKey));
Request.ContentLength = byteArray.Length;
Stream dataStream = Request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
// SEND MESSAGE
try
{
WebResponse Response = Request.GetResponse();
HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
{
Logger.log("Unauthorized - need new token");
}
else if (!ResponseCode.Equals(HttpStatusCode.OK))
{
Logger.log("Response from web service isn't OK");
}
//HttpStatusCode.
StreamReader Reader = new StreamReader(Response.GetResponseStream());
string responseLine = Reader.ReadToEnd();
Reader.Close();
Logger.log("Post Response from GCM = " + responseLine);
以下是由上述代码生成的实际日志,显示来自 FCM 的 MimatchSenderId 错误(尽管它显示为 GCM)。 (消息看起来很奇怪,因为它都是加密的)。
2018 年 6 月 25 日 12:08:43 PMDBAWP7 发布到 GCM = { "registration_ids": [ “eBGLX0_IzPI:APA91bGKIRz6Qu-W-OrFjB2vY5_yS8EanepiZjkz83borQw2bvHwWLvuzNSQAr3WStWDY2ijALLBAnGgq64jWfW2YHMkAImgEKdAWZvgj7m1MXgpB9_2zH7uRdLUQNAG2jmEK3YzHYxgJBgzd” ], "data":{"Message":"9FnAod3oemeAH0iw8oojG5WNnmcqmiGLjIjESex0mHY\u003d\n","aeskey":"tSFErur1I8O1ADjhP5UTNdpryNwVw156bTr9Hz70//jpJoUIcEE41KOjkrt8yKpQQpSgqgj2A2/GMDXOzIN2wEVnKRqJir7Ylp85DHuj2Z0swOnEuYPUTHXv3z6iQXZlVrw65EP6TrpqyAnCppejqxuDAC2wtQI1zpfRWIlBs9sSnsucOxtpBEbIAo2AdWaBAnL9JtzuMc/xG/IzLKFsH5+DBOwQccWM4MfK8RbpVmS0RUxzSBbkUi2RBVW86ZP6vzAdliR9qCRVzr2K/x7/7IvCdmpzT5V2LM0xBiXA0Vr8BBBOygXVxM4HYplNS8C7C6eSeb/JzoGD8qj/hMvDTw\u003d\u003d","fromLang ":"English","fromPhoneKey":"gbsamsung","fromUsername":"","mine":"y","subActive":"n","timeSentGMT":"2018-06-25 19:08:43","toPhoneKey":"emulator27","tran":"##03"}}
2018 年 6 月 25 日 12:08:44 PMDBAWP7 来自 GCM 的回复 = {"multicast_id":5172924974567668915,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
在我的项目中,我没有在代码中使用 SENDER_ID 做任何事情。
【问题讨论】:
-
您是否尝试过先验证服务器密钥? firebase.google.com/docs/cloud-messaging/…
-
宾果游戏!我仍在使用旧的 GCM 密钥。谢谢 MatPag!
标签: android firebase google-cloud-messaging firebase-cloud-messaging