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/