应用程式被杀死时,Firebase不会收到消息-Android Oreo [英] Firebase don't receive message when app is killed - Android Oreo

查看:96
本文介绍了应用程式被杀死时,Firebase不会收到消息-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);
        }
    }​

谢谢!

推荐答案

消息priority

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆