我正在使用以下代码来监视我的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 上运行缺少什么的任何想法?
谢谢!
适用于iOS 6和iOS 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/