ios – 检测用户点击本地通知

我会定期显示这样的本地通知.
UIlocalnotification *notification = [[UIlocalnotification alloc]init];
[notification setAlertBody:@"Test test"];
[notification setUserInfo:@{@"test": @"test"}];
[[UIApplication sharedApplication] presentlocalnotificationNow:notification];

我需要检测回来的通知,我打算在这里写.

- (void)application:(UIApplication *)application didReceivelocalnotification:(UIlocalnotification *)notification

无论用户点击通知还是自动前台呼叫,它总是调用功能.

所以,我分开使用它.

if (application.applicationState == UIApplicationStateActive)

当我显示通知中心时,它变为InActive.但是,它仍然调用didReceivelocalnotification.我无法区分用户是否点击通知中心的通知或是因为我的定期发布通知.

我怎么才能真正知道我在didReceivelocalnotification中点击通知(来自InActive State或Background State)?

解决方法

假设我正确地理解了你的问题,我偶然发现了同样的障碍,找不到超级干净的解决方案.

那么以下方法的情况

- (void)application:(UIApplication *)application didReceivelocalnotification:(UIlocalnotification *)notification

调用并且applicationState等于UIApplicationStateInactive在两种情况下发生:

>该应用程序位于前台,通知刚刚被触发
>通知已经被解雇,通知中心被拉下来并且用户点击了通知

区分这两种情况的一种方法是检查通知的fireDate:

notification.fireDate.timeIntervalSinceNow < 0.5

如果这个表达式为真,那很可能是第一个案例发生了.如果表达式为假,则第二种情况很可能发生.

解决方案取决于系统无延迟地发送通知和/或用户不够快,以便在通知触发后500ms内点击通知中心的通知.我不确定发射延迟的可能性有多大.我想如果设备处于某种处理负载下是可能的.

我希望有一个更清洁的解决方案,希望有人会分享它.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...