在锁定屏幕iOS上显示交互式本地推送通知

时间:2015-11-01 13:06:58

标签: ios cocoa-touch uilocalnotification appdelegate

我已经使用两个操作配置了本地推送通知类别。推送通知运行正常,我正在AppDelegate中的application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier方法中处理这些通知。

我现在的问题是如何才能在用户的锁定屏幕上显示此类通知?我对willResignInactive方法的假设是,应用程序仍然可以在用户锁定设备后运行,至少一段时间。我希望能够在用户锁定设备之后准确触发通知,以便可以从锁定屏幕使用自定义操作。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我认为您无法访问该特定事件,因为它超出了您的应用权限范围,因为有applicationDidBecomeActiveapplicationWillTerminate等等。这些是您的边界,但您可以计时10分钟后,希望他们锁定手机?或者为了更准确,您可以检查他们是否确实放下了手机,请查看以下答案:

Lock Unlock events iphone

答案 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加载数据。