如何在“推送通知”轻按上导航到特定页面

时间:2018-11-27 14:19:05

标签: c# firebase xamarin xamarin.forms firebase-cloud-messaging

我正在使用FirebasePushNotificationPluginXamarin.Forms中开发firebase推送通知。我以某种方式在Application文件中收到有关Android项目的通知以及数据

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();
}

Android项目中的MainActivity.cs类

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.Hakim的回答,以下代码始终在不发送通知的情况下打开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 :(得分:2)

实际上非常简单,您可以使用一些技巧来实现:

  • 首先,从通知中调用MainActivity,以便可以使用现有的xamarin表单加载功能。

  • 然后在App类构造函数上维护一个布尔值,如下所示:

    Linux::inotify2
  • 现在这是偷看节目的把戏,当您在MainActivity中收到通知时,在load app方法中将布尔值传递为true,如果通知中存在任何内容则传递数据。

    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
    }
    

注意:我已在构造函数中定义了可选参数,因此您甚至可以使用空的应用程序构造函数使其正常工作;

更新

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

答案 1 :(得分:0)

已通过从通知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"]}")
            });
        });
    }
};

注意:以上代码在应用打开和后台运行时有效。不适用于前景。有关更多信息,请访问this ticket