我正在使用FirebasePushNotificationPlugin
在Xamarin.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();
}
}
答案 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。