我使用以下代码来监控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上运行吗?
谢谢!
答案 0 :(得分: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];
另外,我建议不要将您的位置管理代码放在app delegate中。虽然在技术上它会起作用,但对于这样的事情来说,它通常不是一个好的设计模式。相反,在上面的例子中,我会尝试将它放在它自己的位置管理器类中,这可能是一个单例。这篇博文提供了一些很好的支持,为什么不在应用代理中放入大量的东西:http://www.hollance.com/2012/02/dont-abuse-the-app-delegate/