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而不发送通知。有关更多信息,请查看我的编辑。我已经编辑了我的答案,并说明了代码应该如何使用。我感谢您的帮助。然而,这个问题与插件有关,而不是我们的代码。我已经发布了答案,请看一看。谢谢。