我想我已经完成了将我的消息传递应用程序从GCM转换为FCM所需的所有步骤,但它不起作用。 FCM 目前正在重新发布 MismatchSenderId。
我的安卓清单中定义了以下服务.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
}
实例 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# 代码在我的服务器上运行,并执行 FCM 发布。 这是我相同的GCM发布代码,除了FCM网址。("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_2zH7uRdLUQNAG2jmEK3YzHYxgJBQTq_Cgz1mOpNxbDeLU3A" ], "数据": {"Message":"9FnAod3oemeAH0iw8oojG5WNnmcqmiGLjIjESex0mHY\u003d","aeskey":"tSFErur1I8O1ADjhP5UTNdpryNwVw156bTr9Hz70//jpJoUIcEE41KOjkrt8yKpQQpSgqgj2A2/GMDXOzIN2wEVnKRqJir7Ylp85DHuj2Z0swOnEuYPUTHXv3z6iQXZlVrw65EP6TrpqyAnCppejqxuDAC 2wtQI1zpfRWIlBs9sSnsucOxtpBEbIAo2AdWaBAnL9JtzuMc/xG/IzLKFsH5+DBOwQccWM4MfK8RbpVmS0RUxzSBbkUi2RBVW86ZP6vzAdliR9qCRVzr2K/x7/7IvCdmpzT5V2LM0xBiXA0Vr8BBBOygXVxM4HYplNS8C7C6eSeb/JzoGD8qj/hMvDTw\u003d\u003d","fromLang":"中文","fromPhoneKey":"gbsamsung","fromUsername":","mine":"y","subActive":"n","timeSentGMT":"2018-06-25 19:08:43","toPhoneKey":"emulator27","tran":"##03"}}
6/25/2018 12:08:44 PMDBAWP7 来自 GCM 的帖子响应 = {"multicast_id":5172924974567668915,"成功":0,"失败":1,"canonical_ids":0,"结果":[{"错误":"MismatchSenderId"}]}
在我的项目中,我没有在代码中使用SENDER_ID做任何事情。
我刚刚遇到了类似的问题。我发现有多个google-services.xml文件(由合并引起(,甚至具有不同的名称(如google-services_LOCAL_46008(可能包含在构建中,导致ID错误。 检查包含google服务的文件夹.xml只有一个文件。一个我删除了任何无关的xml文件,它奏效了。