Xamarin Forms: Prism: Android: MainActivity: нажмите на Push-уведомления: PushAsync не поддерживается во всем мире для Android, используйте NavigationPage - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь реализовать базовый пример push-уведомлений, используя Xamarin Forms с Prism MVVM, Azure & FCM.

Я получаю уведомление, но не могу перейти на определенную страницу при нажатии на уведомление.

Попытка базовой функциональности, когда приложение работает или в фоновом режиме (не закрыто).

Выдает исключение «PushAsync не поддерживается глобально на Android, используйте NavigationPage» на

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 && 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 
    }
}

Есть идеи, которые могут помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Вы можете получить доступ к экземпляру Prims NavigationService, чтобы добиться того, что вы пытаетесь сделать. Но это охраняемая собственность. Итак, сначала вам нужно будет представить его через класс приложения, как показано ниже:

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 && intent.HasExtra("XamId"))
    {
        var navigationService = (Xamarin.Forms.Application.Current as ContosoCookbook.App).NavigationService;
        await navigationService.NavigateAsync("YourNavigationPage/SpecificPage");
    }
}
0 голосов
/ 23 марта 2019

Причина, по которой это происходит, заключается в том, что ваша Application.Current.MainPage не является страницей навигации, а является ContentPage (я предполагаю)

Оберните ваши начальные MainPage в NavigationPage, как показано ниже, и это должно работать

В вашем приложении. Xaml.cs

     MainPage= new NavigationPage(new FirstPage());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...