应用程序被杀时,Firebase不会收到消息 - Android Oreo

时间:2018-06-15 20:22:30

标签: android firebase firebase-cloud-messaging message android-8.0-oreo

我知道它对这个主题有很多疑问,但没有人在我的项目中工作,我也不知道为什么。

我使用Firebase,如果我的应用是开放的,或者在后台,他会收到消息,但是当我杀了我的应用时,看起来不会更多。

使用Android 8.0

我的代码: 的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);
}

C#中的代码发送推送

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

谢谢!

2 个答案:

答案 0 :(得分:0)

你需要去设置&gt; <电池优化>并为您的应用禁用它。因为这会阻止您的应用程序运行后台服务

答案 1 :(得分:0)

android内的 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" } }; should not be nested消息,应该有价值&#34;高&#34;:

regex = r'^(?P<line_num>\d{6})(?P<line>.*#include\s+(\".*\\.*\"|<.*\\.*>).*$)'

由于设备处于打盹模式或应用程序处于应用待机模式,您可能无法收到消息。这是explained in the documentation

在对您的邮件进行更改后,您可以致电RemoteMessage.getOriginalPriority()确认收到的邮件是高优先级。