Формы Xamarin: Prism: Android: MainActivity: нажмите на Push-уведомления: PushAsync не поддерживается глобально на Android, пожалуйста, используйте страницу навигации

#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));
  

Я надеюсь, что это поможет.