Интересно, смогу ли я получить некоторую помощь, используя 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-уведомление вместо этого. Я искал все выше и ниже, но все учебники / документы просто выполняют отладочную запись в консоль, доказывая, что переданные пользовательские данные есть, и я тоже вижу, что я не могу найти ничего, что обрабатывало бы реальные случаи использования жизнеспособного рабочего процесса для управления навигацией на основе нажатия уведомления.
Любая помощь или руководство будет принята с благодарностью.
Заранее спасибо.