Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在推送通知点击时导航到特定页面_C#_Firebase_Xamarin_Xamarin.forms_Firebase Cloud Messaging - Fatal编程技术网

C# 如何在推送通知点击时导航到特定页面

C# 如何在推送通知点击时导航到特定页面,c#,firebase,xamarin,xamarin.forms,firebase-cloud-messaging,C#,Firebase,Xamarin,Xamarin.forms,Firebase Cloud Messaging,我正在使用Xamarin.Forms开发firebase推送通知。不知何故,我在应用程序文件中收到了android项目的通知以及数据 CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) => { //System.Diagnostics.Debug.WriteLine("NOTIFICATION RECEIVED", p.Data); var data = p.Data; //Dict

我正在使用
Xamarin.Forms
开发firebase推送通知。不知何故,我在
应用程序
文件中收到了android项目的通知以及数据

CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
{
    //System.Diagnostics.Debug.WriteLine("NOTIFICATION RECEIVED", p.Data);
    var data = p.Data; //Dictionary type
};
基于以上数据,我如何导航到特定的
页面
,除了
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
)。如果我点击应用程序,它总是转到
通知页面
,而不是
主页

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

其实很简单,你可以用一些小技巧:

  • 首先,从通知中调用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
    }
    
    LoadApplication(new App(true,*yourData*))
    
  • 现在,当您在MainActivity中收到通知时,请在load app方法中将bool作为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*))
    
注意:我在构造函数中定义了可选参数,因此您甚至可以使用空的应用程序构造函数使其工作

更新:

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());
 }
private bool IsNotification=false;
私有对象通知数据;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
TabLayoutResource=Resource.Layout.Tabbar;
ToolbarResource=Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
全局::Xamarin.Forms.Forms.Init(这个,savedInstanceState);
FirebasePushNotificationManager.ProcessIntent(此,Intent);
CrossFirebasePushNotification.Current.OnNotificationOpen+=(s,p)=>
{
System.Diagnostics.Debug.WriteLine(“收到通知”,p.Data);
通知数据=p.数据;
IsNotification=false;
DependencyService.Get().DisplayTost(“打开的通知”);
};
如果(IST通知)
LoadApplication(新应用程序(iNotification、NotificationData));
其他的
加载应用程序(新应用程序());
}

此问题已通过从通知
有效负载发送
颜色
键解决

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"]}")
            });
        });
    }
};

注意:当应用程序在后台打开时,上述代码有效。不在前台工作。有关更多信息,请访问。

您需要这样做natively@G.hakim-我已经为Xamarin.android实现了通知,但我仍然不知道如何才能做到这一点,以便它能够轻松地与表单结合。如果我以导航方式打开Activity1,它与共享项目的
页面的关系如何?我们将在Activity1中初始化您的Xamarin表单页面,然后只需推送到您要导航到的页面。如何在初始化activity后推送页面?使用此
全局::Xamarin.forms.forms.Init(此为savedInstanceState);加载应用程序(新应用程序())如果你愿意,我可以发布一个例子!!谢谢你的回答。我会回复。哦,是的,还有一件事我认为你需要调用这个
FirebasePushNotificationManager.ProcessIntent(这个,Intent)在加载应用程序方法之前。当我点击应用程序图标时,您的代码总是打开NotificationPage而不发送通知。有关更多信息,请查看我的编辑。我已经编辑了我的答案,并说明了代码应该如何使用。我感谢您的帮助。然而,这个问题与插件有关,而不是我们的代码。我已经发布了答案,请看一看。谢谢。