Определить, включен ли экран iPhone - PullRequest
11 голосов
/ 24 мая 2011

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 24 мая 2011

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

2 голосов
/ 08 января 2013

Вы можете использовать Дарвинские уведомления , чтобы прослушивать события.Я не уверен на 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

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

1 голос
/ 23 сентября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...