2013-11-19 4 views
1

Я реализую приложение iOS7 с помощью карт Google Maps SDK для iOS & Мониторинг области структуры CoreLocation. После регистрации области мониторинга, вызывая метод requestStateForRegion, но у меня нет реакции на метод didDetermineState: forRegion на устройстве (iOS7.0.4, iPhone5S).CLLocationManager: didDetermineState: forRegion не называется

можно получить сделалUpdateLocation способ, поэтому, думаю, процесс делегирования работает нормально. В симуляторе метод didDetermineState: forRegion называется правильно.

Что мне делать, чтобы исправить эту проблему? код инициализации выглядит следующим образом.

Любые советы, оцененные. Заранее спасибо.

- (void)viewDidLoad 
{ 
    if (locManager == nil) { 
     locManager = [CLLocationManager new]; 
    } 
    locManager.delegate = self; 

    CLLocationCoordinate2D targetCenter; 
    targetCenter.latitude = LATITUDE_CENTER; 
    targetCenter.longitude = LONGITUDE_CENTER; 
    CLLocationDegrees radius = TARGET_RADIUS; 
    if (locManager.maximumRegionMonitoringDistance < TARGET_RADIUS){ 
     radius = locManager.maximumRegionMonitoringDistance; 
    } 
    self.targetRegion = [[CLCircularRegion alloc] 
        initWithCenter:targetCenter 
        radius:radius 
        identifier:@"TargetRegion"]; 

    BOOL monitoringAvailability = [CLLocationManager isMonitoringAvailableForClass:[self.targetRegion class]]; 
    if(monitoringAvailability) { 
     if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { 
      [locManager startMonitoringForRegion:self.targetRegion]; 
     } 
    } 

    [locManager requestStateForRegion:self.targetRegion]; 
} 

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region 
{ 
    if (state == CLRegionStateInside){ 
     NSLog(@"is in target region"); 
     self.isInTargetRegion = YES; 
    }else{ 
     NSLog(@"is out of target region"); 
     self.isInTargetRegion = NO; 
    } 
} 
+0

Мне не нравится, если startMonitoringForRegion не удалось, поэтому я проверил locManager.monitoredRegions, после чего я нашел правильно начатый мониторинг. – kinamin

ответ

5

Я сам нашел ответ.

на устройстве iPhone, Настройки -> Общие -> Обновление фонового меню Включить фоновое обновление приложения, а затем правильно называть didDetermineState.

+0

Это также вызывает проблемы с CLBeaconRegion. 'isMonitoringAvailableForClass:' возвращает 'YES' даже думал, что BackgroundAppRefresh выключен. Но руководство Apple по настройке местоположения и карт * указывает, что в этой ситуации оно должно возвращать «НЕТ». – Tobias

+0

@Tobias, поведение 'isMonitoringAvailableForClass:' является правильным. Метод 'isMonitoringAvailableForClass:' сообщает вам, поддерживает ли базовое ** аппаратное обеспечение ** мониторинг области для указанного класса вообще. Это не имеет никакого отношения к обновлению фонового приложения. – RaffAl

+1

@reecon - Спасибо за информацию. Просто перечитайте Документацию, и она явно говорит ** аппаратное обеспечение **. В нем также говорится, что я могу проверить статус обновления фона, вызвав '[UIApplication backgroundRefreshStatus]'. Я должен был бы тесно сотрудничать с RTFM. Я думал, что точки пули были связаны с методом isMonitoringAvailableForClass:. – Tobias

2

В iOS 8 необходимо запросить kCLAuthorizationStatusAuthorizedAlways с помощью [CLLocationManager requestAlwaysAuthorization]. Вам также потребуется иметь запись NSLocationAlwaysUsageDescription в файле Info.plist.

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