新聊天消息中的 Firebase 推送通知



我创建了一个应用程序,其中有聊天功能。

我希望用户在应用程序之外时会收到一条通知,告知他们会收到一条新消息。

为此,我正在使用Firebase服务。

现在,每当发送消息时,我调用此方法: 我创建了以下MyFirebaseMessagingService类来测试何时调用它:

private class MyTask extends AsyncTask<MyTaskParams, Void, Void> {
@Override
protected Void doInBackground(MyTaskParams... params) {
String userDeviceIdKey = params[0].url;
String title = params[0].title;
String body = params[0].body;
String authKey = "XXXXX";   // You FCM AUTH key
String FMCurl = "https://fcm.googleapis.com/fcm/send";
URL url;
try {
url = new URL(FMCurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization","key="+authKey);
conn.setRequestProperty("Content-Type","application/json");
JSONObject json = new JSONObject();
json.put("to",userDeviceIdKey);
json.put("priority","high");
JSONObject info = new JSONObject();
info.put("title", title);   // Notification title
info.put("body", body); // Notification body
info.put("var1", chatID);
info.put("var2",receiverID);
info.put("var3",itemID);
json.put("data", info);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(json.toString());
wr.flush();
Log.w("", "getInstanceId failed" + json);
conn.getInputStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}

在我的服务中,我创建了:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d("TESTING_MESSAGE", "" + remoteMessage);
}
}

但是,当我发送消息时,似乎我从未收到过这个Log,而且看起来onMessageReceived从未被调用过。

有什么原因吗?

我的下一个目标是在onMessageReceived内部发出通知,但我想首先确保我到达那里。

我的清单是:

<service
android:name=".service.MyFirebaseMessagingService"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>

我用你的代码做了一个演示应用程序,它运行良好,我可以看到当消息到达时,onMessageReceived 函数被触发。

我使用的是火力通讯版本 20.1.7

implementation 'com.google.firebase:firebase-messaging:20.1.7'

所以我认为你应该做以下检查:

  1. 检查您的应用是否位于前台。 因为当应用在后台运行时,您无法触发 onMessageReceived。 参考: https://firebase.google.com/docs/cloud-messaging/android/receive#handling_messages

  2. 检查您在发送 HTTP 请求时是否编写了正确的设备令牌(您的字段"userDeviceIdKey"(。

  3. 检查您的 HTTP 请求在 catch 中是否有一些错误。

希望能帮助你。

如果应用被杀死,将永远不会调用onMessageReceived()方法。 Firebase onMessage在后台应用运行时未被调用

首先检查您发送的内容:数据消息或通知消息。 它们可能看起来相同,但取决于消息的类型,调用不同的方法。 看看这个: https://firebase.google.com/support/faq/#fcm-android-background

检查消息是否包含通知有效负载。

if (remoteMessage.getNotification() != null) {
Map test = remoteMessage.getData();
Log.d(TAG, "Message data payload: " + test);

检查消息是否包含数据有效负载。

if (remoteMessage.getData().size() > 0) {
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + 
remoteMessage.getNotification().getBody());

相关内容

  • 没有找到相关文章

最新更新