我已经使用两个操作配置了本地推送通知类别。推送通知运行正常,我正在AppDelegate中的application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier
方法中处理这些通知。
我现在的问题是如何才能仅在用户的锁定屏幕上显示此类通知?我对willResignInactive
方法的假设是,应用程序仍然可以在用户锁定设备后运行,至少一段时间。我希望能够在用户锁定设备之后准确触发通知,以便可以从锁定屏幕使用自定义操作。
任何帮助都将不胜感激。
答案 0 :(得分:2)
我认为您无法访问该特定事件,因为它超出了您的应用权限范围,因为有applicationDidBecomeActive
,applicationWillTerminate
等等。这些是您的边界,但您可以计时10分钟后,希望他们锁定手机?或者为了更准确,您可以检查他们是否确实放下了手机,请查看以下答案:
答案 1 :(得分:0)
使用来自@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加载数据。