Appcenter push: динамическая навигация на основе пользовательских данных - PullRequest
0 голосов
/ 18 апреля 2019

Интересно, смогу ли я получить некоторую помощь, используя AppCenter push в моем приложении Xamarin Forms, предназначенном для Android и iOS.

По сути, я следовал инструкциям и могу видеть push-уведомления при тестировании на Android. Я понимаю, что между уведомлениями на переднем и заднем плане существуют разные варианты поведения, и они проходят через отладчик, когда происходит событие PushNotificationReceived.

У меня проблема в том, что я не могу найти надежный способ изолировать, когда пользователь входит в приложение, потому что он нажал на уведомление, когда приложение не загружено.

В моем App.xaml.cs у меня есть следующее:

protected override async void OnInitialized()
        {

            InitializeComponent();
            Push.PushNotificationReceived += Push_PushNotificationReceived;


            AppCenter.Start("ios={ios ID}" +
                  "uwp={Your UWP App secret here};" +
                  "android={android ID}",
                  typeof(Analytics), typeof(Crashes), typeof(Push));

            await NavigationService.NavigateAsync("Splash"); // this is my splash screen that shows

        }

private async void Push_PushNotificationReceived(object sender, PushNotificationReceivedEventArgs e)
        {
            if (e.CustomData != null)
            {
                if (e.CustomData.ContainsKey("roundId"))
                {
                    string roundId = e.CustomData["roundId"];
                   //I want to navigate directly to this UI 
                    await NavigationService.NavigateAsync($"IconNavigationPage/HomeView/Round?roundId={roundId}");
                }
            }
        }

Итак, как вы можете видеть, при нормальных обстоятельствах приложение загружает представление Splash, которое выполняет некоторую загрузку, и перенаправляет на домашнее представление. Когда уведомление получено и приложение работает в фоновом режиме, на Android оно работает нормально. Я изменил свой режим запуска на SingleTop и добавил следующее в свой файл MainActivity.cs

    protected override void OnNewIntent(Android.Content.Intent intent)
            {
                base.OnNewIntent(intent);
                Push.CheckLaunchedFromNotification(this, intent);
            }

Проблема в том, что, когда приложение не работает в фоновом режиме, и я нажимаю на уведомление, вызывается навигационный вызов экрана-заставки, а затем мой навигационный вызов в событии PushNotificationReceived. По сути, это приводит к тому, что приложение загружает пользовательский интерфейс, определенный в событии, на секунду, после чего происходит перенаправление Splash UI. Это связано с тем, что OnInitialize () запускается, когда приложение загружается из-под касания уведомления, когда приложение не работает в фоновом режиме.

Я экспериментировал, пытаясь реализовать обработчик событий PushNotificationReceived в файле Android MainActivity.cs, и я вижу, что он срабатывает перед теми же обработчиками событий PushNotificationReceived в проекте Shared. К сожалению, он запускается после вызова LoadApplication, поэтому OnInitialize () моего общего проекта запускается первым (с этим навигационным вызовом Splash)

Полагаю, что мне нужно какое-то руководство или, возможно, указание на учебник, о том, как можно выполнить уведомление OnInitialize проекта Shared, чтобы не выполнять стандартную навигацию в Splash, а выполнять навигацию, необходимую для Push-уведомление вместо этого. Я искал все выше и ниже, но все учебники / документы просто выполняют отладочную запись в консоль, доказывая, что переданные пользовательские данные есть, и я тоже вижу, что я не могу найти ничего, что обрабатывало бы реальные случаи использования жизнеспособного рабочего процесса для управления навигацией на основе нажатия уведомления.

Любая помощь или руководство будет принята с благодарностью.

Заранее спасибо.

...