2013-10-10 3 views
6

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

// создать и зарегистрировать область с прошивкой

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); 
} 

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

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

Спасибо!

ответ

0

Что-то, что должно работать как для 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/