#xamarin.forms #push-notification #xamarin.android #firebase-cloud-messaging #prism
#xamarin.forms #push-уведомление #xamarin.android #firebase-облако-обмен сообщениями #prism
Вопрос:
Я пытаюсь реализовать базовый пример push-уведомлений, используя формы Xamarin с Prism MVVM, Azure и FCM.
Я получаю уведомление, но не смог перейти на определенную страницу при нажатии на уведомление.
Пробую базовую функциональность, когда приложение запущено или в фоновом режиме (не закрыто).
Он выдает исключение «PushAsync не поддерживается глобально на Android, пожалуйста, используйте страницу навигации» на
ExploreXam.App.Current.MainPage.Navigation.PushAsync(page);
[Activity(LaunchMode = LaunchMode.SingleTask, MainLauncher = true]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static readonly string CHANNEL_ID = "explore_xamarin";
internal static readonly int NOTIFICATION_ID = 1029;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
CreateNotificationChannel();
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
Intent = intent;
NotificationClickedOn(intent);
}
private void NotificationClickedOn(Intent intent)
{
if (intent.Action == ExploreXamFirebaseMessagingService.ExploreXamNotification amp;amp; intent.HasExtra("XamId"))
{
var page = new Xamarin.Forms.NavigationPage(new SpecificPage());
Xamarin.Forms.Application.Current.MainPage.Navigation.PushAsync(page);
ExploreXam.App.Current.MainPage.Navigation.PushAsync(page);
}
}
}
public partial class App : PrismApplication
{
public bool navigating;
public App(IPlatformInitializer initializer = null, bool shallNavigate=false) : base(initializer)
{
navigating = shallNavigate;
}
protected async override void OnInitialized()
{
BlobCache.ApplicationName = "ExploreXam";
InitializeComponent();
FlowListView.Init();
//await NavigationService.NavigateAsync("LoginPage");
await NavigationService.NavigateAsync("NavigationPage/LoginPage");
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//mapping
}
}
Есть идеи, которые могли бы помочь, пожалуйста?
Ответ №1:
Вы могли бы получить доступ к экземпляру NavigationService Prims, чтобы достичь того, что вы пытаетесь сделать. Но это защищенное свойство. Итак, сначала вам нужно будет предоставить его через свой класс приложения, как показано ниже :
public new INavigationService NavigationService => base.NavigationService;
Теперь вы можете получить доступ к NavigationService из любого места вашего приложения, просто сославшись на него через ваше приложение, как показано ниже:
(Xamarin.Forms.Application.Current as App).NavigationService.NavigateAsync("your/page/path");
Итак, ваш класс приложения будет выглядеть примерно так:
public partial class App : PrismApplication
{
public new INavigationService NavigationService => base.NavigationService;
public bool navigating;
public App(IPlatformInitializer initializer = null, bool shallNavigate=false) : base(initializer)
{
navigating = shallNavigate;
}
protected async override void OnInitialized()
{
BlobCache.ApplicationName = "ExploreXam";
InitializeComponent();
FlowListView.Init();
//await NavigationService.NavigateAsync("LoginPage");
await NavigationService.NavigateAsync("NavigationPage/LoginPage");
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//mapping
}
}
И ваша функция NotificationClickOn станет чем-то вроде :
private async void NotificationClickedOn(Intent intent)
{
if (intent.Action == ExploreXamFirebaseMessagingService.ExploreXamNotification amp;amp; intent.HasExtra("XamId"))
{
var navigationService = (Xamarin.Forms.Application.Current as ContosoCookbook.App).NavigationService;
await navigationService.NavigateAsync("YourNavigationPage/SpecificPage");
}
}
Ответ №2:
Причина, по которой это происходит, заключается в том, что Application.Current.MainPage
это не страница навигации, а страница содержимого (я полагаю)
Оберните свой исходный код MainPage
на страницу навигации, как показано ниже, и это должно сработать
В вашем App.xaml.cs
MainPage= new NavigationPage(new FirstPage());
Комментарии:
1. @Hakim,, Я добавил App.cs для справки. Все еще сталкиваюсь с той же проблемой.
Ответ №3:
Я согласен с @chaosifier. Создайте общедоступный INavigationService в вашем файле App.xaml.cs, а затем в методе OnInitialized() создайте общедоступное свойство = the base.NavigationService;
public INavigationService PrismNavigation { get; private set; }
protected override async void OnInitialized()
{
InitializeComponent();
PrismNavigation = base.NavigationService;
}
Затем из файла MainActivity.cs вы можете перемещаться, используя что-то вроде этого
(Xamarin.Forms.Application.Current as App).PrismNavigation.NavigateAsync(nameof(ShowAlertsDetailPage));
Я надеюсь, что это поможет.