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

Display interactive local push notifications on lock screen iOS

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

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

如有任何帮助,我们将不胜感激。

我认为您无权访问该特定事件,因为它不在您的应用程序管辖范围内,这就是为什么有 applicationDidBecomeActiveapplicationWillTerminate 等。这些是您的边界,但您可以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 加载数据。