在锁定屏幕上显示交互式本地推送通知 iOS
Display interactive local push notifications on lock screen iOS
我已经配置了一个包含两个操作的本地推送通知类别。推送通知 运行 很好,我在 AppDelegate 中的 application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier
方法中处理这些通知。
我现在的问题是如何才能仅在用户的锁定屏幕上显示此类通知?我对 willResignInactive
方法的假设是,在用户锁定设备后,应用程序仍然可以 运行 至少一段时间。我想要一种在用户锁定设备后立即触发通知的方法,以便可以从锁定屏幕使用自定义操作。
如有任何帮助,我们将不胜感激。
我认为您无权访问该特定事件,因为它不在您的应用程序管辖范围内,这就是为什么有 applicationDidBecomeActive
、applicationWillTerminate
等。这些是您的边界,但您可以10 分钟后计时,希望他们锁定 phone?或者为了更准确,您可以检查他们是否确实放下了 phone,检查这个答案:
Lock Unlock events iphone
使用来自@apptality 的一些细节,我能够使用 Darwin Notifications 来实现这一点。 This answer 解释了如何使通知正常工作。我使用以下代码来执行此操作:
在 AppDelegate 的 didFinishLaunchingWithOptions
方法中放置以下代码:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
(void*)self, // observer (can be NULL)
lockStateChanged, // callback
CFSTR("com.apple.springboard.lockcomplete"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
然后使用此方法处理通知:
static void lockStateChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
NSLog(@"event received!");
if (observer != NULL) {
AppDelegate *this = (__bridge AppDelegate*)observer;
NSString* notifyName = (__bridge NSString*)name;
if ([notifyName isEqualToString:@"com.apple.springboard.lockcomplete"]) {
[this localNotificationSetup];
}
}
}
其中 localNotificationSetup
是您注册发送通知的位置。请小心,因为这是一个基于 c 的方法,所以您的 objective-c 代码中有很多需要更改。然后,您可以使用此方法处理通知操作:
-(void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler
要真正完成任何有用的事情,您可能需要在您的应用进入休眠状态时使用此方法从 nsuserdefaults 加载数据。
我已经配置了一个包含两个操作的本地推送通知类别。推送通知 运行 很好,我在 AppDelegate 中的 application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier
方法中处理这些通知。
我现在的问题是如何才能仅在用户的锁定屏幕上显示此类通知?我对 willResignInactive
方法的假设是,在用户锁定设备后,应用程序仍然可以 运行 至少一段时间。我想要一种在用户锁定设备后立即触发通知的方法,以便可以从锁定屏幕使用自定义操作。
如有任何帮助,我们将不胜感激。
我认为您无权访问该特定事件,因为它不在您的应用程序管辖范围内,这就是为什么有 applicationDidBecomeActive
、applicationWillTerminate
等。这些是您的边界,但您可以10 分钟后计时,希望他们锁定 phone?或者为了更准确,您可以检查他们是否确实放下了 phone,检查这个答案:
Lock Unlock events iphone
使用来自@apptality 的一些细节,我能够使用 Darwin Notifications 来实现这一点。 This answer 解释了如何使通知正常工作。我使用以下代码来执行此操作:
在 AppDelegate 的 didFinishLaunchingWithOptions
方法中放置以下代码:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
(void*)self, // observer (can be NULL)
lockStateChanged, // callback
CFSTR("com.apple.springboard.lockcomplete"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
然后使用此方法处理通知:
static void lockStateChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
NSLog(@"event received!");
if (observer != NULL) {
AppDelegate *this = (__bridge AppDelegate*)observer;
NSString* notifyName = (__bridge NSString*)name;
if ([notifyName isEqualToString:@"com.apple.springboard.lockcomplete"]) {
[this localNotificationSetup];
}
}
}
其中 localNotificationSetup
是您注册发送通知的位置。请小心,因为这是一个基于 c 的方法,所以您的 objective-c 代码中有很多需要更改。然后,您可以使用此方法处理通知操作:
-(void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler
要真正完成任何有用的事情,您可能需要在您的应用进入休眠状态时使用此方法从 nsuserdefaults 加载数据。