CoreLocation startMonitoringRegion не увольняет делегатов didenterregion / didexitregion - PullRequest
1 голос
/ 21 октября 2011

Кажется, я не получаю, чтобы кто-либо из делегатов didenterregion / didexitregion стрелял, застрял на нем 2 дня

я использую xcode4.2 с ios5 sdk и симуляцией местоположения,

У кого-нибудь есть удача заставить это работать? радиус 100 м слишком мал? (я пробовал 1000 тоже не работает) или что-то не так с моим кодом

проверено также при обычном обновлении местоположения, и местоположение пользователя действительно входит в регион. нигде не смог найти ответа

Метод ViewDidLoad в MainViewController (также CLLocationManagerDelegate):

mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
mapView.showsUserLocation = YES;
mapView.mapType = MKMapTypeStandard;
mapView.delegate = self;
[self.view addSubview:mapView];
MKCoordinateRegion region;// = {{0.0,0.0},{0.0,0.0}};
MKCoordinateSpan span;
span.latitudeDelta = 0.02;
span.longitudeDelta = 0.02;
CLLocationCoordinate2D coordinates =CLLocationCoordinate2DMake(1.34537, 103.84515);
    region.span = span;
region.center = coordinates;
[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];

if (locationManager==nil){
locationManager = [[CLLocationManager alloc] init];
}
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[self.locationManager setDistanceFilter:kCLDistanceFilterNone];
self.locationManager.delegate =self;    

if ([CLLocationManager regionMonitoringAvailable]){
    NSLog(@"regionMonitoring available");

CLRegion* region3 = [[CLRegion alloc] initCircularRegionWithCenter:coordinates radius:100 identifier:@"region3"];
[self.locationManager startMonitoringForRegion:region3 desiredAccuracy:1.0];    
NSLog(@"region = %@",region3);
NSLog(@"loc max = %f",self.locationManager.maximumRegionMonitoringDistance);
NSLog(@"location manger monitored regions = %@",self.locationManager.monitoredRegions);

также реализованы все необходимые методы делегата

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didfailwitherror");
}


- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
        NSLog(@"latitude %+.10f, longitude %+.10f\n",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
 }
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"didenterregion");

}
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
    NSLog(@"didexitregion");
}

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

спасибо за любую помощь

1 Ответ

6 голосов
/ 05 января 2012

Как вы проверяли местоположение? Регионы немного сложны, но как только они созданы, они обычно работают отлично. Что я обычно делаю, чтобы проверить регион, так это просто использую пользовательское местоположение в симуляторе. Используйте те же координаты, которые вы добавляете в свой регион. 1000М довольно большой. Я тестировал с регионами, такими как 15-20M. Если у вас есть правильные координаты, все должно быть в порядке. Попробуйте переключаться между Apple HQ и вашими пользовательскими координатами. Вы должны видеть, что методы didEnter и didExit отключаются практически мгновенно, если они отключены.

Единственная область, с которой у вас могут возникнуть проблемы, - это то, что обратные вызовы могут не попасть в ваш метод. Ни один из моих регионов не работал, пока я не настроил свой AppDelegate как CLLocationManagerDelegate. Делегат приложения наконец получил обновления и правильно их обработал. Я бы попытался сначала добавить эти обратные вызовы, а затем вернуться к контроллеру mainview. Надеюсь, это поможет.

UPDATE

С тех пор как я ответил на этот вопрос, я узнал кое-что еще о мониторинге региона. Регионы добавляются с минимальным размером региона, несмотря на то, что вы добавляете по умолчанию. Инженер Apple сказал мне, что минимальный размер региона составляет 100M. Я до сих пор чувствую, что они очень точные, но это может помочь понять, почему он вас зафиксирует. Если вам нужна точность выше 100М, вам, возможно, придется поискать другие варианты.

...