检测手机屏幕是否在iOS中打开/​​关闭

时间:2014-03-10 02:05:39

标签: ios

我的应用程序要求在应用程序处于后台时检测手机屏幕是否打开/关闭?我发现使用私有框架Spring板可以实现这一点。 我们可以使用公共API吗?

感谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

AppDelegate.m中的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    //Other code
    [self registerforDeviceLockNotif];
}

//Register Notification
-(void)registerforDeviceLockNotif
{
    //Screen screenDisplayStatus notifications
    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenDisplayStatus, CFSTR("com.apple.iokit.hid.displayStatus"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);

    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                    NULL, // observer
                                    screenLockStatus, // callback
                                    CFSTR("com.apple.springboard.lockstate"), // event name
                                    NULL, // object
                                    CFNotificationSuspensionBehaviorDeliverImmediately);
}

//RemoveNotification if you don't need any more.
-(void)removeforDeviceLockNotif{
    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, CFSTR("com.apple.iokit.hid.displayStatus"), NULL);
    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, CFSTR("com.apple.springboard.lockstate"), NULL);
}

//Call back Methods
static void screenDisplayStatus(CFNotificationCenterRef center, void* observer, CFStringRef name, const void* object, CFDictionaryRef userInfo) {
    uint64_t state;
    int token;
    notify_register_check("com.apple.iokit.hid.displayStatus", &token);
    notify_get_state(token, &state);
    notify_cancel(token);
    if (state) {
        screenIsBlack = NO;
    }else{
        screenIsBlack = YES;
    }
}

static void screenLockStatus(CFNotificationCenterRef center, void* observer, CFStringRef name, const void* object, CFDictionaryRef userInfo)
{
    uint64_t state;
    int token;
    notify_register_check("com.apple.springboard.lockstate", &token);
    notify_get_state(token, &state);
    notify_cancel(token);
    if (state) {
        screenIsLocked = YES;
    }
    else
    {
        screenIsLocked = NO;
    }
}

当屏幕为黑屏时,您是否正在执行任务:

if (appIsBackground && (screenIsBlack || screenIsLocked) {
    //do Task.
}

请注意,此处我已将屏幕锁定状态设为为黑屏,如果不需要,只需删除锁定状态判断。

答案 1 :(得分:0)

还要考虑处于后台模式的应用只会在暂停之前的一段时间内运行/执行任务。然后,所有代码都停止执行,应用程序暂停"暂停"。

如果您的应用提供GPS跟踪,音频播放等功能,那么您可以请求Apple允许其在后台保持活动状态。如果它没有提供上述或类似的东西 - 那么你的应用程序将只在背景中生活一个非常不确定的短时间,因此,检测屏幕状态可能是徒劳的。