Как перейти на определенную страницу на Push Notification нажмите - PullRequest
0 голосов
/ 27 ноября 2018

Я разрабатываю push-уведомления Firebase в Xamarin.Forms, используя FirebasePushNotificationPlugin.Каким-то образом я получаю уведомления для проекта Android в файле Application вместе с данными

CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
{
    //System.Diagnostics.Debug.WriteLine("NOTIFICATION RECEIVED", p.Data);
    var data = p.Data; //Dictionary type
};

На основе приведенных выше данных, как я могу перейти к конкретному Page кроме MainPage()?

Это мой файл App.xaml.cs в общем проекте

public App()
{
    InitializeComponent();
    MainPage = new MainPage();
}

Класс MainActivity.cs в проекте Android

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());

        FirebasePushNotificationManager.ProcessIntent(this, Intent);
    }

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        FirebasePushNotificationManager.ProcessIntent(this, intent);
    }
}

Редактировать 1 : Согласно @G.Хаким ответом ниже код всегда открывает NotificationsPage без отправки уведомления (За исключением первого раза. Только при первом открытии MainPage при запуске приложения).Если я нажимаю на приложение, оно всегда отображается как NotificationsPage вместо MainPage.

MainActivity.cs

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App(false,null));

    FirebasePushNotificationManager.ProcessIntent(this, Intent);
    CrossFirebasePushNotification.Current.OnNotificationOpened += (s, p) =>
    {
        System.Diagnostics.Debug.WriteLine("NOTIFICATION RECEIVED", p.Data);
        var data = p.Data;
        DependencyService.Get<IToast>().DisplayTost("opened notifications");
        LoadApplication(new App(true, p));
    };
}

App.xaml.cs

public App(bool hasNotification = false, object notificationData = null)
{
    if (hasNotification)
    {
        MainPage = new NotificationsPage();
    }
    else
    {
        MainPage = new MainPage();
    }
}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Эта проблема была решена путем отправки ключа color из уведомления payload.

CrossFirebasePushNotification.Current.OnNotificationOpened += (s, p) =>
{
    if (p.Data.ContainsKey("color"))
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            Xamarin.Forms.Application.Current.MainPage.Navigation.PushModalAsync(new NotificationsPage()
            {
                BackgroundColor = Color.FromHex($"{p.Data["color"]}")
            });
        });
    }
};

Примечание: вышеуказанный код работает, когда приложение открыто и в фоновом режиме.Не работает на переднем плане.Для получения дополнительной информации посетите этот билет .

0 голосов
/ 28 ноября 2018

Это на самом деле очень просто, вы можете сделать это, используя некоторые хитрости:

  • Сначала вызовите MainActivity из вашего уведомления, чтобы вы могли использовать существующие функции загрузки форм xamarin.

  • Затем поддержите bool в конструкторе класса вашего приложения примерно так:

    public App(bool hasNotification=false,object notificationData=null)
    {
       if(hasNotification)
       {//case where you receive a notification} // call your normal functionality here 
       else
       {//case where you do not recieve a notification} // notification functionality here
    }
    
  • Теперь вот трюк, который ворует шоу, Когда вы получаетеуведомление в вашей MainActivity передает значение bool как истинное в методе загрузки приложения и передает данные, если в уведомлении есть что-то похожее. Примерно так:

    LoadApplication(new App(true,*yourData*))
    

Примечание: Я определил необязательный параметр в конструкторе, чтобы вы могли использовать пустой конструктор приложения, чтобы он работал;

Обновление:

private bool IsNotification=false;
private object NotificationData;
   protected override void OnCreate(Bundle savedInstanceState)
 {
   TabLayoutResource = Resource.Layout.Tabbar;
   ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    FirebasePushNotificationManager.ProcessIntent(this, Intent);    
    CrossFirebasePushNotification.Current.OnNotificationOpened += (s, p) =>
    {
       System.Diagnostics.Debug.WriteLine("NOTIFICATION RECEIVED", p.Data);
       NotificationData = p.Data;
       IsNotification=false;
       DependencyService.Get<IToast>().DisplayTost("opened notifications");           
    };
   if(IsNotification)
    LoadApplication(new App(IsNotification,NotificationData)); 
   else
    LoadApplication(new App());
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...