iOS 7 didEnterRegion根本没有被调用

时间:2013-10-10 15:35:03

标签: ios7 cllocationmanager clregion clcircleregion

我使用以下代码来监控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 个答案:

答案 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/