В момента в това приложение за iOS добавих някакъв контролер, който съм написал като наблюдател към [NSNotificationCenter defaultCenter]
, за да наблюдавам NSUserDefaultsDidChangeNotification
.
- (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 и не видях промяна).
ВЪПРОСЪТ МИ Е Правя ли нещо нередно, което може да доведе до блокиране на това с диспечера на местоположението? Или това е някакъв вътрешен проблем с опашката за CLLocationManager? Или нещо друго? Може би CLLocationManager
ще стартира само ако приложението е на преден план? Дори ако случаят беше такъв, аз трябваше все още да виждам изявленията в регистрационния файл, че поне опитва да стартира диспечера на местоположението, нали?