У меня есть приложение iOS, которое представляет собой приложение с вкладками, с 3 контроллерами представлений, все из которых должны знать, когда телефон входит в определенные географические регионы.CLLocationManager только контролирует регионы при первом запуске приложения после установки
Области, которые мы контролируем, поставляются во время работы через веб-интерфейс, поэтому нам необходимо периодически очищать регионы, которые CLLocationManager осуществляет мониторинг и добавляет новые. Объект CLLocationManager является переменной-членом одноэлементного класса, который также управляет соединением с веб-сервером.
Проблема, которая возникает у меня, заключается в том, что, когда приложение впервые установлено, мониторинг области работает нормально. Но в первый раз я пытаюсь запустить его после, что в первый раз, мониторинг региона не работает.
Я вижу это как на фактической телефонной трубке , так и на iOS симулятор.
При получении mesasge от сервера, который содержит подробности области, мы запускаем следующий код:
-(void) initialiseLocationManager:(NSArray*)geofences
{
if(![CLLocationManager locationServicesEnabled])
{
NSLog(@"Error - Location services not enabled");
return;
}
if(self.locationManager == nil)
{
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
}
else
{
[self.locationManager stopUpdatingLocation];
}
for(CLRegion *geofence in self.locationManager.monitoredRegions)
{
//Remove old geogate data
[self.locationManager stopMonitoringForRegion:geofence];
}
NSLog(@"Number of regions after cleanup of old regions: %d", self.locationManager.monitoredRegions.count);
if(self.locationManager == nil)
{
[NSException raise:@"Location manager not initialised" format:@"You must intitialise the location manager first."];
}
if(![CLLocationManager regionMonitoringAvailable])
{
NSLog(@"This application requires region monitoring features which are unavailable on this device");
return;
}
for(CLRegion *geofence in geofences)
{
//Add new geogate data
[self.locationManager startMonitoringForRegion:geofence];
NSLog(@"Number of regions during addition of new regions: %d", self.locationManager.monitoredRegions.count);
}
NSLog(@"Number of regions at end of initialiseRegionMonitoring function: %d", self.locationManager.monitoredRegions.count);
[locationManager startUpdatingLocation];
}
Я пытался дозвониться [locationmanager stopUpdatingLocation] в разных местах, в частности, в различных местах Файл AppDelegate.m (applicationWilLResignActive, applicationDidEnterBackground, applicationWillTerminate), но ни один из них, похоже, не помогает. В любом случае, когда я создаю свое приложение и добавляю файл GPX для имитации местоположений, имитатор правильно подбирает регионы, отправляемые веб-интерфейсом. Во второй раз, когда я запускаю программу, регионы не подбираются. Когда я перезагружаю файл GPX, он работает снова, но со второго раза он больше не работает.
Согласно документации API, CLLocationManager сохраняет запись регионов даже при завершении (именно поэтому я очищаю области, за которыми мы отслеживаем), но я предполагаю, что моя процедура инициализации хороша в первый раз приложение запускается, но вызывает то, что не следует вызывать со второго раза. Кроме того, процесс очистки не всегда работает (заявление NSLog часто показывает, что CLLocationManager выполняет очистку до 0 регионов, но не всегда).
Любые идеи, почему это не работает?