2013-08-27 4 views
1

У меня есть приложение 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 регионов, но не всегда).

Любые идеи, почему это не работает?

ответ

3

Так позволяет очистить это немного

Вам не нужно звонить startUpdatingLocation и stopUpdatingLocation при использовании мониторинга региона. Они активируют стандартное отслеживание местоположения, отправляя сообщения на обратный вызов делегата locationManager:didUpdateLocations:. трекинга область приложения реализации этих делегатов обратных вызовов:

– locationManager:didEnterRegion: 
– locationManager:didExitRegion: 

Кроме того, его очень маловероятно, что место службы будет отключена в течение этого метода, и вы должны убедиться, что его не удается избавиться от «locationManager» из фона нить. Поэтому нам не нужно их проверять дважды.

Как вы оцениваете регион, чтобы убедиться, что у вас есть мониторинг региона с + (BOOL)regionMonitoringAvailable. Также лучше всего проверить разрешения на размещение с + (CLAuthorizationStatus)authorizationStatus в какой-то момент и отреагировать соответствующим образом.

По this blog post, кажется, вы также должны иметь

UIBackgroundModes :{location} 
UIRequiredDeviceCapabilities: {location-services} 

в вашей информации приложений.plist, чтобы все это работало правильно.

Если у вас есть дополнительная информация о способе отказа, я могу вернуться с более конкретным советом :)

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