Определить, включен ли экран iPhone

Есть ли способ определить, включен ли экран iPhone? Например, когда нажата кнопка блокировки экрана телефона.

Я использую (void)applicationWillResignActive:(UIApplication *)application; чтобы подготовиться к таким событиям (который в большинстве случаев работает нормально), но этот метод также используется для входящих вызовов, текстовых сообщений и т. д.

Насколько я могу судить, не существует документированного метода для определения этого.

Я играл с некоторыми обходными путями, такими как проверка, изменилось ли разрешение экрана, проверка, неизвестна ли ориентация, или получение яркости устройства. Ничего еще не получилось.

Есть ли у кого-нибудь креативные / обходные решения для этого?

3 ответа

Решение

Да, нет окончательного метода. UIApplication имеет свойство protectedDataAvailable который вернется YES когда экран разблокирован и NO если заблокировано только тогда, когда пользователь включает защиту контента. Так что это самое близкое, но ненадежное, что я могу придумать. В таком случае вы можете даже слушать UIApplicationProtectedDataDidBecomeAvailable а также UIApplicationProtectedDataWillBecomeUnavailable уведомления.

Вы можете использовать уведомления Дарвина, чтобы прослушивать события. Я не уверен на 100%, но мне кажется, после запуска на взломанном iOS 5.0.1 iPhone 4, что одним из этих событий может быть то, что вам нужно:

com.apple.iokit.hid.displayStatus
com.apple.springboard.hasBlankedScreen
com.apple.springboard.lockstate

Примечание: согласно комментариям автора к аналогичному вопросу, на который я ответил здесь, это должно работать и на не взломанном телефоне.

Чтобы использовать это, зарегистрируйтесь для такого события (это регистрируется только для одного события, но если это не работает для вас, попробуйте два других):

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                NULL, // observer
                                displayStatusChanged, // callback
                                CFSTR("com.apple.iokit.hid.displayStatus"), // event name
                                NULL, // object
                                CFNotificationSuspensionBehaviorDeliverImmediately);

где displayStatusChanged Ваш обратный вызов события:

static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    NSLog(@"event received!");
    // you might try inspecting the `userInfo` dictionary, to see 
    //  if it contains any useful info
    if (userInfo != nil) {
        CFShow(userInfo);
    }
}

Я полагаю, что события, перечисленные выше, запускаются, когда экран включается и выключается, блокируется и разблокируется. Возможно, вам придется отслеживать состояние самостоятельно. Также,

com.apple.springboard.lockcomplete

вызывается только когда экран блокируется, а не когда он разблокируется.

Попробуйте этот обходной путь. Автор утверждает, что хорошо работает на 4.2

Я проверил это на iOS 3.1 (iPhone 3G) - работает хорошо.

обновление: не работает на iOS 5 beta 7 (iPod Touch 4G):-(

update2: приложение переходит в фоновый режим при заблокированном экране, поэтому решение работает на iOS 5 beta 7:-)

Другие вопросы по тегам