1

В настоящее время в этом приложении iOS я добавил контроллер, который я написал в качестве наблюдателя в [NSNotificationCenter defaultCenter], чтобы наблюдать NSUserDefaultsDidChangeNotification.NSUserDefaultsDidChangeNotification Не запускается после отправки StopUpdatingLocation в CLLocationManager

- (void)startObservingDefaults 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(userDefaultsDidChange) 
               name:NSUserDefaultsDidChangeNotification 
               object:nil]; 
} 

Пользователь по умолчанию, что я наблюдаю должен включить или отключить CLLocationManager с помощью PSToggleSwitchSpecifier из меню настроек. После запуска приложения и отправки startUpdatingLocation в CLLocationManager ivar я могу перейти в меню настроек и отключить диспетчер местоположений. Мой селектор userDefaultsDidChange затем проверяет, включено ли это по умолчанию или отключено. Если он включен, я посылаю startUpdatingLocation экземпляру диспетчера местоположений, если он отключен, я посылаю ему stopUpdatingLocation. Каждый путь регистрирует свое действие, как так

- (void)userDefaultsDidChange 
{ 
    if ([self duringOperationHours] && [self isEnabled]) { 
     NSLog(@"\n\n\nWithin Operating Hours.\n\n\n"); 
     [_locationManager startUpdatingLocation]; 
     NSLog(@"Enabled Location Manager."); 
    } else { 
     NSLog(@"\n\n\nDisabled or Outside of Operating Hours.\n\n\n"); 
     [_locationManager stopUpdatingLocation]; 
     NSLog(@"Disabled Location Manager."); 
    } 
} 

У меня есть другие параметры, которые контролируют время суток (время начала и время окончания Исх. 6 утра до 6 вечера). Если я изменю одну из этих настроек, и текущее время все еще находится в пределах этого временного диапазона, журнал покажет, что он по-прежнему «В пределах рабочего времени». и что диспетчер местоположений включен.

Если изменить его так, что менеджер место получает отключен, он делает журнал как NSLog заявления в моем методе выше и НЕ закрыть менеджер местоположения.

Проблема возникает, когда я пытаюсь запустить ее обратно. Так что скажите, что я в настройках, и он включен. Я отключил его, журнал показывает, что он отключен, а значок для GPS исчезает, если я снова включу его, уведомление не срабатывает вообще. Фактически, никакие другие настройки даже в других дочерних панелях не срабатывают, пока я не вернусь к приложению. (Я пробовал dispatch_async внутри метода userDefaultsDidChange как main_queue, так и global_queue и не видел изменений).

МОЙ ВОПРОС IS Я делаю что-то не так, что может привести к блокировке с менеджером местоположения? Или это проблема внутренней очереди для CLLocationManager? Или что-то другое? Возможно, CLLocationManager начнется только в том случае, если приложение находится на переднем плане? Даже если это так, то я должен все еще видели в отчетах журнала, что он по крайней мере пытался, чтобы начать работу с менеджером?

ответ

0

Nevermind Я понял это.

Наблюдение за NSNotificationCenter на NSUserDefaultsDidChangeNotificationНЕ ДЕЛАЕТ Проснись. То, что происходило, это протокол CLLocationManagerDelegate, примененный к моему контроллеру, «пробудит» приложение, чтобы сделать то, что ему нужно, с полученными CLLocation. После этого пробуждения наблюдение за изменением некоторых пользовательских значений по умолчанию в NSNotificationCenter сработало бы с моего селектора userDefaultsDidChange.

CLLocationManager обновлялся и там, чтобы предупредить приложение, он позволит контроллеру вызвать назначенный селектор. Когда CLLocationManager больше не обновляет местоположение, приложение не будет просвещаться и, следовательно, не знает, что пользовательские настройки по умолчанию были изменены до тех пор, пока приложение не вернется на передний план.

Я обновлю этот ответ, если придумаю лучшее решение для этого необычного сценария наблюдения.

+0

извините за столкновение. Вы выяснили? Я в той же ситуации ... Спасибо. –

+0

Это ответ. Уведомления NSNotificationCenter не пробудят приложение для этого конкретного события. CLLocationManager пробуждал приложение и позволял получать уведомление. После отключения вы должны будете вернуть приложение на передний план, чтобы получать события. –

Смежные вопросы