Определите, включен ли экран 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: -)