В настоящее время в этом iOS-приложении я добавил некоторый контроллер, который я написал в качестве наблюдателя для [NSNotificationCenter defaultCenter]
для наблюдения за NSUserDefaultsDidChangeNotification
.
- (void)startObservingDefaults
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(userDefaultsDidChange)
name:NSUserDefaultsDidChangeNotification
object:nil];
}
Пользователь по умолчанию, который я наблюдаю, должен включать или отключать CLLocationManager
с помощью PSToggleSwitchSpecifier
в меню настроек. После запуска приложения и отправки startUpdatingLocation
на CLLocationManager
ивар я могу зайти в меню настроек и отключить менеджер местоположений. Затем мой селектор 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:00 до 18:00). Если я изменю один из этих параметров, а текущее время все еще будет в пределах этого временного диапазона, в журнале будет указано, что оно все еще находится в режиме «В рабочие часы». и что диспетчер местоположений включен.
Если я изменю его так, чтобы диспетчер местоположений отключился, он зарегистрирует оба оператора NSLog
в моем методе выше и ДЕЙСТВИТЕЛЬНО закроет диспетчер местоположений.
Проблема возникает, когда я пытаюсь запустить его обратно. Так сказать я в настройках и он включен. Я отключаю его, журнал показывает, что он отключен, и маленький значок GPS исчезает, если я затем снова включу его, уведомление вообще не срабатывает. На самом деле никакие другие настройки даже в других дочерних панелях не срабатывают, пока я не вернусь в приложение. (Я попробовал dispatch_async
внутри метода userDefaultsDidChange
как для main_queue, так и для global_queue и не увидел изменений).
МОЙ ВОПРОС: я делаю что-то не так, из-за чего это может заблокироваться в диспетчере местоположений? Или это какая-то внутренняя проблема с очередью для CLLocationManager? Или что-то другое? Возможно CLLocationManager
запустится только если приложение на переднем плане? Даже если бы это было так, я должен по-прежнему видеть сообщения в журнале о том, что он по крайней мере попытался запустить менеджер местоположений, верно?