Firebase don't receive message when app is killed - Android Oreo

别来无恙 提交于 2019-12-08 13:52:22

问题


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.

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.

Using Android 8.0

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

@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

@Override
public void onTokenRefresh() {

    super.onTokenRefresh();
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d("Token", "Refreshed token: " + refreshedToken);
}

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);
        }
    }​

Thanks!


回答1:


you need to go to settings> battery optimization> and disable it for your app. as that stops your application from running background services




回答2:


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"
        }
    };

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().



来源:https://stackoverflow.com/questions/50882199/firebase-dont-receive-message-when-app-is-killed-android-oreo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!