应用程式被杀死时,Firebase不会收到消息-Android Oreo [英] Firebase don't receive message when app is killed - Android Oreo
问题描述
我知道关于这个主题有很多问题,但是在我的项目中没有人工作,我也不知道为什么.
I know that it have a lot of questions about this theme, but no one works in my project, and I don't know why.
我正在使用Firebase,如果我的应用程序处于打开"或在背景"中,他会收到消息,但是当我杀死我的应用程序时,不会再出现该消息了.
I'm using Firebase, if my app is OPEN or in BACKGROUND, his receive the message, but when I kill my app don't appear more.
使用Android 8.0
Using Android 8.0
我的代码: AndroidManifest.xml
My codes: AndroidManifest.xml
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/default_notification_icon" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorPrimary" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<service
android:name=".service.PineFirebaseMessagingService"
android:enabled="true"
android:exported="true"
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>
<service
android:name=".service.PineFirebaseInstanceIDService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
FirebaseMessagingService.java
FirebaseMessagingService.java
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
channelId = getString(R.string.default_notification_channel_id);
Log.i("Msg", "Message received [" + remoteMessage.getData() + "]");
Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new
NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.default_notification_icon)
.setColor(ContextCompat.getColor(this, R.color.colorPrimary))
.setContentTitle(remoteMessage.getData().get("title"))
.setContentText(remoteMessage.getData().get("message"))
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setSound(defaultSoundUri);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel mChannel = new NotificationChannel(
channelId,
remoteMessage.getData().get("title"),
NotificationManager.IMPORTANCE_HIGH);
mChannel.setDescription(remoteMessage.getData().get("message"));
mChannel.enableLights(true);
mChannel.enableVibration(true);
mChannel.setLightColor(Color.BLUE);
notificationManager.createNotificationChannel(mChannel);
notificationManager.cancel(id);
}
notificationManager.notify(id, notificationBuilder.build());
}
FirebaseInstanceIdService.java
FirebaseInstanceIdService.java
@Override
public void onTokenRefresh() {
super.onTokenRefresh();
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Token", "Refreshed token: " + refreshedToken);
}
C#中的代码以发送推送
Code in C# to send the push
async Task SendPushAndroidAsync(Device device, InArgumentRequest push, Notification notification)
{
var applicationID = configuration["Push:Google:ApplicationKey"];
var data1 = new
{
to = DeviceIdEnviroment(device.Token, true),
android = new {
priority = "normal"
},
data = new
{
notificationId = notification.Id,
title = notification.Title,
message = notification.Message,
type = notification.Type,
date = notification.DateCreated.ToString("dd/MM/yyyy HH:mm"),
android_channel_id = "channelidandroid"
}
};
try
{
var jsonBody = JsonConvert.SerializeObject(data1);
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, "https://fcm.googleapis.com/fcm/send"))
{
httpRequest.Headers.TryAddWithoutValidation("Authorization", "key=" + applicationID);
httpRequest.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
using (var httpClient = new HttpClient())
{
var result = await httpClient.SendAsync(httpRequest);
if (result.IsSuccessStatusCode)
{
await UpdateStatusNotification(notification, true);
}
else
{
await UpdateStatusNotification(notification, false, result.ReasonPhrase);
}
}
}
}
catch (Exception ex)
{
string error = ex.InnerException.Message;
await UpdateStatusNotification(notification, false, error);
}
}
谢谢!
推荐答案
The message priority
should not be nested inside android
and should have value "high":
var data1 = new
{
to = DeviceIdEnviroment(device.Token, true),
priority = "high",
data = new
{
notificationId = notification.Id,
title = notification.Title,
message = notification.Message,
type = notification.Type,
date = notification.DateCreated.ToString("dd/MM/yyyy HH:mm"),
android_channel_id = "channelidandroid"
}
};
您可能没有收到该消息,因为该设备处于打ze模式或该应用处于应用待机模式.这是在文档中解释的.
It's possible you are not receiving the message because the device is in Doze Mode or the app is in App Standby Mode. This is explained in the documentation.
After making the change to your message you can confirm that it is received with high priortity by calling RemoteMessage.getOriginalPriority().
这篇关于应用程式被杀死时,Firebase不会收到消息-Android Oreo的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!