我已经在Xamarin Forms上创建了一个应用程序,在其中我通过名为Plugin.Notifications的插件在PCL中调度本地通知。但是我想知道用户是否通过通知进入应用程序。
我试图检查UIApplication.LaunchOptionsLocalNotificationKey是否在启动“选项”字典中存在,但是启动选项字典始终为空。
然后我尝试通过ReceivedLocalNotification委托方法处理它,并且我能够获得tap事件,当应用程序在前台或后台运行时,它工作正常,但是当应用程序被终止并通过点击打开时,通知,它崩溃了。
我找不到崩溃的问题。
这是我在ReceivedLocalNotification方法中正在做的事情。
我正在通过DependencyService设置布尔值。
public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
{
NSUserDefaults.StandardUserDefaults.Init();
DependencyService.Get<INotificationTap>().SetNoitificationTap(true);
}
依赖服务的处理
[assembly: Xamarin.Forms.Dependency(typeof(NotificationTapIOS))]
namespace abc.iOS
{
public class NotificationTapIOS:NSObject,INotificationTap
{
public bool GetNotificationTap()
{
return NSUserDefaults.StandardUserDefaults.BoolForKey("notificationTapKey");
}
public void SetNoitificationTap(bool isNotificationTapped)
{
NSUserDefaults.StandardUserDefaults.SetBool(isNotificationTapped,"notificationTapKey");
NSUserDefaults.StandardUserDefaults.Synchronize();
}
}
答案 0 :(得分:0)
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
if (options != null)
{
// check for a local notification
if (options.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
{
var localNotification = options[UIApplication.LaunchOptionsLocalNotificationKey] as UILocalNotification;
if (localNotification != null)
{
LoadApplication(new App());
UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;// reset our badge
}
}
}
else
{
LoadApplication(new App());
}
}
答案 1 :(得分:0)
我找到了解决此问题的方法,我不知道这是否是正确的方法,但是它对我有用。
在Xamarin.iOS中,启动应用程序时,首先调用基类方法(即applicationDidFinishLaunching),然后再调用Xamarin部分(即FinishedLaunching)。
因此我更改了FinishedLaunching参数名称,类似于基类参数(即,将'app'更改为'uiApplication',将'options'更改为'launchOptions),并在launchOptions词典中找到了密钥。
public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions)
{
global::Xamarin.Forms.Forms.Init();
isNotificationTapped = false;
if (launchOptions != null) {
if (launchOptions.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
isNotificationTapped = true;
}
LoadApplication(new App());
return base.FinishedLaunching(uiApplication, launchOptions);
}
当用户通过通知点击启动应用程序时,将执行AppDelegate的FinishedLaunching方法,我们可以验证launchOptions词典以查找点击事件,以及应用程序处于后台还是运行阶段,并且用户点击通知然后调用AppDelegate的RecieveLocalNotification方法。
public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
{
isNotificationTapped = true;
}
初始化值后,我使用DependencyService将其保存在UserDefaults中