Не удается отобразить удаленные уведомления FCM, когда приложение Xamarin.Forms для Android закрыто, остановлено или не работает - PullRequest
0 голосов
/ 27 августа 2018

Я использовал эти инструкции для добавления удаленных уведомлений на основе концентратора Azure FCM в мое приложение Xamarin.Forms для Android.

https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-xamarin-forms-get-started-push

Я могу получать удаленные уведомления, когда приложение открыто или работает в фоновом режиме, но когда я закрываю приложение или останавливаю приложение, я больше не получаю удаленные уведомления.

Мое тестовое устройство работает на уровне API 22, поэтому я использую следующий метод для создания уведомлений на устройстве.

Android.Support.V4.App.NotificationCompat.Builder builder = new Android.Support.V4.App.NotificationCompat.Builder (это)

Для API уровня 26+ я использую метод follow вместе с каналом для создания уведомления на устройстве.

var builder = new Android.App.Notification.Builder (this)

Я думаю, что для этого мне нужно использовать BroadcastReceiver, но я действительно понятия не имею, прочитав так много комментариев на эту тему. Мое приложение скомпилировано с использованием API 27 и предназначено для API 27.

Метод 1

Я пытаюсь создать BroadcastReceiver, который будет запускать MyService с использованием явного намерения при получении уведомления. К сожалению, это не работает на моем тестовом устройстве API уровня 22.

//[BroadcastReceiver]
//[IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
[BroadcastReceiver(Enabled = true, Exported = true)]
    [IntentFilter(new[] { "com.xamarin.example.TEST" })]
    public class MyBroadcastReceiver : BroadcastReceiver
    {

        public override void OnReceive(Context context, Intent intent)
        {
            string message = intent.GetStringExtra("message");
            string title = intent.GetStringExtra("title");
            string id = intent.GetStringExtra("id");

            //Explicit Intent to launch MyService
            Intent intent2 = new Intent(Application.Context, typeof(MyService));
            intent2.PutExtra("message", message);
            intent2.PutExtra("title", title);
            intent2.PutExtra("id", id);

            Application.Context.StartService(intent2);
        }

     }


// Service is exported and given a name so other applications can use it
    [Service(Exported = true, Name = "com.mycompany.myapp.MyService")]
    // Intent filter only needed for Implicit Intents
    //[IntentFilter(new string[] { "com.xamarin.example.TEST" })]
    public class MyService : Service
    {

        public static string PRIMARY_NOTIF_CHANNEL = "default";

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            var pm = PowerManager.FromContext(this);
            var wakeLock = pm.NewWakeLock(WakeLockFlags.Partial, "Notification");
            wakeLock.Acquire();

            string message = intent.GetStringExtra("message");
            string title = intent.GetStringExtra("title");
            string id = intent.GetStringExtra("id");

            var intent2 = new Intent(this, typeof(MainActivity));
            intent2.PutExtra("id", id);
            intent2.AddFlags(ActivityFlags.ClearTop);

            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);

            NotificationManager notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);

            Android.Support.V4.App.NotificationCompat.Builder builder = new Android.Support.V4.App.NotificationCompat.Builder(this)
                   .SetAutoCancel(true)
                   .SetContentIntent(pendingIntent)
                   .SetContentTitle(title)
                   .SetContentText(message)
                   .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
                   .SetVibrate(new long[1])
                   //1 is Hi
                   .SetPriority(1)
                   .SetLargeIcon(BitmapFactory.DecodeResource(Resources, SalesFlash.Droid.Resource.Drawable.Icon_lg))
                   .SetSmallIcon(MyApp.Droid.Resource.Drawable.icon)
                   .SetChannelId(PRIMARY_NOTIF_CHANNEL);

            notificationManager = NotificationManager.FromContext(this);
            notificationManager.Notify(0, builder.Build());

            wakeLock.Release();

            //return StartCommandResult.Sticky;

            return base.OnStartCommand(intent, flags, startId);
        }

        public override void OnDestroy()
        {
            base.OnDestroy();
        }
    }

Согласно этому сообщению, BroadCastReceiver не будет работать для уведомлений FCM. https://stackoverflow.com/a/44287962/5360237

Похоже, что в этом сообщении BroadcastReceiver принимает уведомления. https://stackoverflow.com/a/45616014/5360237

Любая помощь очень ценится. Заранее спасибо!

1 Ответ

0 голосов
/ 08 сентября 2018

Вот лучший пост, который я прочитал, который объясняет проблему. Это также предоставляет ручное решение для затронутых устройств. https://medium.freecodecamp.org/why-your-push-notifications-never-see-the-light-of-day-3fa297520793 Мне удалось заставить Уведомления работать (когда приложение закрыто, остановлено или не запущено) в моей Alcatel One Touch Pop, перейдя в «Настройки - Приложения» и затем переместившись на вкладку «Ограниченные». Отсюда я смог снять галочку с моего приложения.

ПРИМЕЧАНИЕ. Сообщения доставляются в мое приложение для Android с использованием данных. Несмотря на то, что я получал уведомления на переднем и заднем плане, я пошел дальше и добавил следующее разрешение в мой AndroidManifest.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  

Это разрешение используется для автоматического запуска. Я также использовал Центр приложений Azure для распространения подписанного APK на моем тестовом устройстве. Надеюсь, это поможет кому-то еще.

ОБНОВЛЕНИЕ: я удалил разрешение RECEIVE_BOOT_COMPLETE и выполнил сборку отладки. Я закрыл приложение из Debug (подключенного к Visual Studio), смахнув его с экрана. Затем я отправил уведомление, и оно не отображалось. Затем я снова открыл приложение (не отлаживаемое Visual Studio) и закрыл его, проведя пальцем по экрану, отправив уведомление, и оно заработало. Таким образом, он не имеет ничего общего с разрешением RECEIVE_BOOT_COMPLETE и не обязательно должен быть выпущенной версией / подписанным APK.

...