В настоящее время в этом приложении 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
начнется только в том случае, если приложение находится на переднем плане? Даже если это так, то я должен все еще видели в отчетах журнала, что он по крайней мере пытался, чтобы начать работу с менеджером?
извините за столкновение. Вы выяснили? Я в той же ситуации ... Спасибо. –
Это ответ. Уведомления NSNotificationCenter не пробудят приложение для этого конкретного события. CLLocationManager пробуждал приложение и позволял получать уведомление. После отключения вы должны будете вернуть приложение на передний план, чтобы получать события. –