处理本地通知点击 Xamarin Forms iOS
Posted
技术标签:
【中文标题】处理本地通知点击 Xamarin Forms iOS【英文标题】:Handle local notification tap Xamarin Forms iOS 【发布时间】:2019-02-13 05:24:50 【问题描述】:我在 Xamarin Forms 上创建了一个应用程序,我在其中通过名为 Plugin.Notifications 的插件在 PCL 中安排本地通知。但是我想知道用户是否通过通知进入应用程序。
我尝试检查 UIApplication.LaunchOptionsLocalNotificationKey 是否存在于启动“选项”字典中,但启动选项字典始终为空。
然后我尝试通过 ReceivedLocalNotification 委托方法来处理它,并且我能够获取点击事件,当应用程序处于前台或后台时它工作正常,但是当应用程序被杀死并通过点击打开时通知,它正在崩溃。
我无法找到崩溃的问题。
这是我在 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();
【问题讨论】:
【参考方案1】: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());
【讨论】:
options 值总是为 'null',所以我无法使用它进行验证,我已经尝试过了,然后必须使用 RecieveLocalNotification 方法。 我有一个解决方法,在命名类似于基类的参数(即应用程序到 uiApplication 和选项到 launchOptions )之后,在这种情况下,launchOption 有密钥。【参考方案2】:我找到了解决此问题的方法,我不知道这是否是正确的方法,但它对我有用。
在 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 中
【讨论】:
以上是关于处理本地通知点击 Xamarin Forms iOS的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Xamarin Forms 中推送通知中的点击事件?
Xamarin.Forms - 适用于 iOS 和 Android 的推送通知
用户关闭应用程序时如何处理用户在 Xamarin iOS 上单击本地通知?