Есть ли способ проверить, заблокировано / разблокировано устройство iOS?

Я использовал обновления местоположения GPS в своем приложении. Я хочу определить, находится ли устройство iOS в спящем режиме, чтобы я мог отключить обновления местоположения GPS и оптимизировать использование батареи. Я уже пробовал pausesLocationupdates в iOS 6, но он не работает по желанию. Я хочу отключить обновления местоположения GPS, как только устройство перейдет в спящий режим. Я хочу обнаружить событие блокировки / разблокировки в устройстве.

Есть ли способ достичь этой функциональности?

до сих пор я получил уведомления darwin, как указано ниже

-(void)registerForall { //Screen lock notifications CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.iokit.hid.displayStatus"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.springboard.lockstate"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.springboard.hasBlankedScreen"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.springboard.lockcomplete"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); } //call back static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { NSLog(@"IN Display status changed"); NSLog(@"Darwin notification NAME = %@",name); } 

Я могу получить уведомления darwin, когда устройство заблокировано / разблокировано, но реальная проблема заключается в том, как определить, произошло ли уведомление из-за блокировки или разблокировки устройства. Журналы консоли:

  LockDetectDemo[2086] <Warning>: IN Display status changed LockDetectDemo[2086] <Warning>: Darwin notification NAME = com.apple.springboard.lockcomplete LockDetectDemo[2086] <Warning>: IN Display status changed LockDetectDemo[2086] <Warning>: Darwin notification NAME = com.apple.springboard.lockstate LockDetectDemo[2086] <Warning>: IN Display status changed LockDetectDemo[2086] <Warning>: Darwin notification NAME = com.apple.springboard.hasBlankedScreen LockDetectDemo[2086] <Warning>: IN Display status changed LockDetectDemo[2086] <Warning>: Darwin notification NAME = com.apple.iokit.hid.displayStatus 

Любой частный API также будет достаточным. Заранее спасибо.

Я решил это так:

 //call back static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { // the "com.apple.springboard.lockcomplete" notification will always come after the "com.apple.springboard.lockstate" notification CFStringRef nameCFString = (CFStringRef)name; NSString *lockState = (NSString*)nameCFString; NSLog(@"Darwin notification NAME = %@",name); if([lockState isEqualToString:@"com.apple.springboard.lockcomplete"]) { NSLog(@"DEVICE LOCKED"); //Logic to disable the GPS } else { NSLog(@"LOCK STATUS CHANGED"); //Logic to enable the GPS } } -(void)registerforDeviceLockNotif { //Screen lock notifications CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.springboard.lockcomplete"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.springboard.lockstate"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); } 

Примечание: уведомление « com.apple.springboard.lockcomplete » всегда будет появляться после уведомления «com.apple.springboard.lockstate»

Обновить

На порядок двух уведомлений больше нельзя полагаться, начиная с последних версий iOS

/ * Регистрация приложения для обнаружения состояния блокировки * /

  -(void)registerAppforDetectLockState { int notify_token; notify_register_dispatch("com.apple.springboard.lockstate", &notify_token,dispatch_get_main_queue(), ^(int token) { uint64_t state = UINT64_MAX; notify_get_state(token, &state); if(state == 0) { NSLog(@"unlock device"); } else { NSLog(@"lock device"); } NSLog(@"com.apple.springboard.lockstate = %llu", state); UILocalNotification *notification = [[UILocalNotification alloc]init]; notification.repeatInterval = NSDayCalendarUnit; [notification setAlertBody:@"Hello world!! I come becoz you lock/unlock your device :)"]; notification.alertAction = @"View"; notification.alertAction = @"Yes"; [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]]; notification.soundName = UILocalNotificationDefaultSoundName; [notification setTimeZone:[NSTimeZone defaultTimeZone]]; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; }); } 

Вот лучшее решение

 #import <notify.h> #define kNotificationNameDidChangeDisplayStatus @"com.apple.iokit.hid.displayStatus" @interface YourClass () { int _notifyTokenForDidChangeDisplayStatus; } @property (nonatomic, assign, getter = isDisplayOn) BOOL displayOn; @property (nonatomic, assign, getter = isRegisteredForDarwinNotifications) BOOL registeredForDarwinNotifications; @end - (void)registerForSomeNotifications { // // Display notifications // __weak YourClass *weakSelf = self; uint32_t result = notify_register_dispatch(kNotificationNameDidChangeDisplayStatus.UTF8String, &_notifyTokenForDidChangeDisplayStatus, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0l), ^(int info) { __strong YourClass *strongSelf = weakSelf; if (strongSelf) { uint64_t state; notify_get_state(_notifyTokenForDidChangeDisplayStatus, &state); strongSelf.displayOn = (BOOL)state; } }); if (result != NOTIFY_STATUS_OK) { self.registeredForDarwinNotifications = NO; return; } self.registeredForDarwinNotifications = YES; } - (void)unregisterFromSomeNotifications { // // Display notifications // uint32_t result = notify_cancel(_notifyTokenForDidChangeDisplayStatus); if (result == NOTIFY_STATUS_OK) { self.registeredForDarwinNotifications = NO; } } 

Приложениям не разрешено прослушивать уведомления о блокировке устройства сейчас !.

Я получил это:

Уважаемый разработчик,

Мы обнаружили одну или несколько проблем с вашим недавним представлением для «xxxx». Чтобы обработать ваше сообщение, необходимо устранить следующие проблемы:

Неподдерживаемая операция. Приложениям запрещается прослушивать уведомления о блокировке устройства.

После исправления этих проблем используйте Xcode или Application Loader для загрузки нового бинарного файла в iTunes Connect. Выберите новый бинарный файл на странице «Сведения о приложении» в «Мои приложения» в iTunes Connect и нажмите «Отправить для просмотра».

С Уважением,

Команда App Store
26 апреля 2017 в 10:56

Джимми обеспечил отличное решение, но безопаснее проходить (__bridge const void *)(self) в качестве наблюдателя.

 CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), displayStatusChanged, CFSTR("com.apple.springboard.lockcomplete"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); 

Это позволяет правильно удалить наблюдателя.

  • CLLocation didupdatetolocation не вызывается
  • Как я могу избежать XCode сброса местоположения на моем iPhone каждый раз, когда он запускается
  • Запуск события, когда пользователь выходит из геозонности
  • Действие жизненного цикла приложения iOS 4 службы стандартного определения местоположения работает в фоновом режиме
  • Уменьшение использования фона в фоновом режиме iOS
  • Как отладка после закрытия приложения
  • Каковы варианты фоновой задачи в iOS
  • Способ определения местоположения iOS для фильтрации недопустимых / неточных местоположений
  • Основы IOS Core Location не работали на симуляторе ios 4.2
  • ios - Геолокация и отслеживание в файле gpx
  • Обнаружение оборудования GPS в iphone
  • Interesting Posts

    SoundCloud API и 401 Ошибка для зарегистрированного приложения

    Как вы преобразовываете OBJ-файл Wavefront в SCNNode с помощью ввода-вывода модели

    Хранение в приложении Покупка квитанций в приложении Keychain

    Как не полностью скрыть меню с помощью ECSlidingViewController?

    Использование необъявленного идентификатора AFHTTPClient

    Как определить, когда звуковой эффект заканчивается?

    Могу ли я сделать один вид в моем приложении в Пейзаже и всех остальных в портретном режиме?

    Устанавливать пользовательский шрифт по умолчанию в программировании на iphone

    Получите высоту клавиатуры iOS без отображения клавиатуры

    Регистрация OTA: MDM и SCEP

    Кордова воспроизводит видео YouTube в фоновом режиме

    полученное предупреждение памяти, затем сбой

    iOS UIWebView падает при попытке запросить URL-адрес

    Может ли файл Xcode .mobileprovision быть установлен в командной строке?

    Как найти функции Objective-C в Xcode?

    Давайте будем гением компьютера.