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