iOS 7 didEnterRegion вообще не вызывается

Я использую следующий код для мониторинга регионов в моем приложении iOS. Он отлично работает, когда я создаю приложение на iOS6. Когда я собираю его на iOS7, didEnterRegion не запускается.

// создаем и регистрируем регион с iOS

CLLocationCoordinate2D venueCenter = CLLocationCoordinate2DMake([favoriteVenue.venueLat      doubleValue], [favoriteVenue.venueLng doubleValue]);
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:venueCenter radius:REGION_RADIUS identifier:favoriteVenue.venueId];

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[appDelegate.locationManager startMonitoringForRegion:[self regionForVenue:favoriteVenue]];

// В AppDelegate.m

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"Entered region: %@", region.identifier);
}

Я также установил необходимые фоновые режимы как "Регистры приложений для обновлений местоположения" в моих файлах plist.

Есть идеи о том, что не хватает этой функции для работы на iOS7?

Спасибо!

1 ответ

То, что должно работать как для iOS 6, так и для 7, - это создать открытый метод внутри вашего класса, который соответствует CLLocationManagerDelegate протокол, который говорит себе, чтобы начать мониторинг региона. Например:

//LocationManagerClass.h

@interface LocationManagerClass : NSObject

      {... other stuff in the interface file}

- (void)beginMonitoringRegion:(CLRegion *)region;

@end

а затем в

//LocationManagerClass.m

@interface LocationManagerClass () <CLLocationManagerDelegate>
@end

@implementation LocationManagerClass

     {... other important stuff like locationManager:didEnterRegion:}

- (void)beginMonitoringRegion:(CLRegion *)region
{
    [[CLLocationManager sharedManager] startMonitoringForRegion:region];
}

@end

Так что в вашем случае вы бы позвонили [appDelegate beginMonitoringRegion:region];

Кстати, я бы рекомендовал НЕ помещать ваш код управления местоположением в делегат приложения. Хотя с технической точки зрения это сработает, это обычно не очень хороший шаблон для подобных вещей. Вместо этого, как в приведенном выше примере, я бы попытался поместить его в свой собственный класс менеджера местоположений, который, вероятно, будет одиночным. Это сообщение в блоге дает хорошую поддержку, почему бы не добавить кучу материала в делегат приложения: http://www.hollance.com/2012/02/dont-abuse-the-app-delegate/

Другие вопросы по тегам