Есть ли способ проверить, заблокировано / разблокировано устройство 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 также будет достаточным. Заранее спасибо.

5 Solutions collect form web for “Есть ли способ проверить, заблокировано / разблокировано устройство iOS?”

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

 //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); 

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

  • Получить GPS-местоположение в IOS 8 с помощью XAMARIN
  • Мониторинг значительных изменений местоположения, приложение закрыто GPS-сигнал (стрелка)
  • Codename - один провайдер GPS и текущее местоположение
  • как получить точное текущее местоположение на карте здания
  • Xamarin iOS Geolocator Фоновая служба Умирает примерно через 30 минут
  • Где найти GPX-файл для iOS Simulator
  • Телефонная подсказка GPS дважды спрашивает
  • Местоположение GPS на iOS и Android
  • Дополненная реальность SDKS
  • Запуск обновлений местоположения CLLocationManager, когда приложение находится в фоновом режиме
  • WGS84 Высота высоты геоида Высота смещения для внешних данных GPS на IOS
  • Interesting Posts

    Как отлаживать push-уведомления на устройствах iOS 7 или iOS 8?

    Как заменить UIAccelerometer на CMMotionManager?

    заголовок раздела для UICollectionView

    Перехват вызовов Ajax в UIWebview – iOS

    iOS – просмотр входа в систему до uitabbarcontroller

    Вызывает ли вызов dispatch_sync (dispatch_get_global_queue ()) в основном потоке приложение для «зависания»?

    чтение образцов с помощью AVAssetReader и timeRange в режиме реального времени

    Google Analytics iOS SDK V0.2 Бета Отмененный таймер с интервалом

    Как отлаживать terminate_handler неожиданно бросил исключение?

    Правильный доступ к контроллеру представления назначения segue для назначения делегатов протокола

    Пользовательская таблица просмотра таблицы не изменяется в зависимости от размера

    Как создать эффект CAAnimation, подобно луне, вращается вокруг Земли и одновременно вращается в IOS?

    Отключить прохождение заголовка плавающего раздела UITableView?

    как рисовать UIBezierPaths

    ios: имитировать касание: ошибки при попытке приватной структуры

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.