iphone CLLocationmanager Обратные вызовы мониторинга региона не сработали - PullRequest
6 голосов
/ 21 декабря 2011

Я пытаюсь использовать регионы мониторинга, чтобы отслеживать, посещали ли пользователи ориентиры. менеджер местоположений инициализируется в viewcontroller вместе с mapkit

в viewdidload контроллера вида:

if (self.locationManager == nil)
{
    //        NSLog(@"creating location manager");
    self.locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    locationManager.distanceFilter = kCLDistanceFilterNone;
}


NSSet* set=[locationManager monitoredRegions];

if ([CLLocationManager regionMonitoringAvailable] && [CLLocationManager regionMonitoringEnabled]) {
    NSLog(@"region monitoring okay");
    NSLog(@"monitored regions: %@",set);
} 

Я получаю NSLogs "Мониторинг региона в порядке" и все регионы правильно.

добавление регионов сделано так

double metres=20.0;
CLLocationDistance dist=metres;
CLLocationAccuracy acc=1.0;

CLRegion *reg=[[CLRegion alloc] initCircularRegionWithCenter:coordinate radius:dist identifier:landmarkObj.landmarkName];

[locationManager startMonitoringForRegion:reg desiredAccuracy:acc];

но обратные вызовы не срабатывают

 - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Entered" 
                                                    message:region.identifier
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil, nil];
    [alert show];
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Exited" 
                                                    message:region.identifier
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil, nil];
    [alert show];
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    NSLog(@"started monitring for region: %@",region);
}

- (void) locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
{
    NSLog(@"%@",error);
}

обновление местоположения, однако, работает нормально.

[locationManager startUpdatingLocation];

запускает обратный вызов didUpdateToLocation, как и ожидалось

Обновление: вместо него используется didUpdatToLocation для мониторинга регионов. все еще интересно узнать, почему это не сработает, похоже, мало кто добился успеха в области мониторинга региона

Ответы [ 5 ]

3 голосов
/ 03 января 2012

средство отслеживания региона предназначено для отслеживания положения с низкой степенью детализации и запускается на границах расположения ячеек, поэтому, если вы не пересекаете границу ячейки, вы никогда не будете проверять свои регионы.У меня были те же проблемы и я исследовал это, и на другом сайте был комментарий об этом, который указывал на этот яблочный форум:

https://devforums.apple.com/message/251046#251046

Если вы прочитаете все комментарии, вы поймете, почему этоне работает.

Я пытаюсь обойти, где я определяю свои собственные NSSets, чтобы содержать отслеживаемые CLRegions и занятые CLRegions, а затем, когда я получаю обратный вызов locationManager: didUpdateToLocation: fromLocation: я проверяю все регионы в моемотслеживаемый набор, чтобы увидеть, был ли я НЕ в наборе inRegions, но теперь я нахожусь в отслеживаемом регионе (добавьте в inRegions и перезвоните с помощью enterRegion) или если я был inRegion, но теперь нет (удалите из inRegions и перезвоните с помощью exitRegion).Сейчас работа ведется.

0 голосов
/ 23 июня 2015

Вам также необходимо указать NSLocationAlwaysUsageDescription в вашем списке, и вам нужно вызвать [locationManager requestAlwayAuthorization] в вашем приложении.NSLocationWhenInUseUsageDescription отключит мониторинг региона.

0 голосов
/ 22 декабря 2011

Попробуйте использовать диск Debug -> Location -> Freeway для симуляции, у меня похожая проблема, но я создал несколько регионов, и didEnterRegion запускается с расстояния более 1000 метров ... Путь не знаю .. Я установил:

locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
locationManager.distanceFilter = kCLDistanceFilterNone;
0 голосов
/ 23 декабря 2011

Что вы кладете для своей центральной координаты? Эта часть отсутствует в вашем примере. Я видел другие примеры, где они не заполняют его достаточно точной координатой в сочетании с радиусом области, чтобы он когда-либо срабатывал. Вам нужно ввести довольно точную координату (вероятно, 5 или 6 десятичных знаков), если вы хотите, чтобы сработал в радиусе 20 метров.

Все остальное выглядит довольно хорошо.

0 голосов
/ 21 декабря 2011

Вы установили CLLocationManagerDelegate на свой ViewController?

@interface Maps : UIViewController <CLLocationManagerDelegate>{  
...
}
...