我正在尝试使用监控区域来跟踪用户是否访问过地标。 位置管理器在mapcontroller中与mapkit一起初始化
在视图控制器的viewdidload中:
if (self.locationManager == nil)
{
// NSLog(@"creating location manager");
self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
locationManager.distanceFilter = kCLDistanceFilterNone;
}
NSSet* set=[locationManager monitoredRegions];
if ([CLLocationManager regionMonitoringAvailable] && [CLLocationManager regionMonitoringEnabled]) {
NSLog(@"region monitoring okay");
NSLog(@"monitored regions: %@",set);
}
我得到NSLogs“区域监控好”以及所有区域正确。
像这样添加区域
double metres=20.0;
CLLocationDistance dist=metres;
CLLocationAccuracy acc=1.0;
CLRegion *reg=[[CLRegion alloc] initCircularRegionWithCenter:coordinate radius:dist identifier:landmarkObj.landmarkName];
[locationManager startMonitoringForRegion:reg desiredAccuracy:acc];
但回调都没有被触发
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Entered"
message:region.identifier
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert show];
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Exited"
message:region.identifier
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert show];
}
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
NSLog(@"started monitring for region: %@",region);
}
- (void) locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
{
NSLog(@"%@",error);
}
然而,更新位置,工作正常。
[locationManager startUpdatingLocation];
按预期触发回调didUpdateToLocation
更新:使用didUpdatToLocation来监控区域。 仍然有兴趣知道为什么这不起作用,看起来很少有人在区域监测方面取得了成功
答案 0 :(得分:3)
区域跟踪内容用于低粒度位置跟踪,并在单元位置边界上触发,因此如果不跨越单元格边界,则永远不会检查区域。我有同样的问题,研究过这个问题,另一个网站对此有评论,指出了这个苹果论坛:
https://devforums.apple.com/message/251046#251046
如果您阅读了所有评论,您将理解为什么这不起作用。
我正在尝试定义我自己的NSSets以包含跟踪的CLRegions并占用CLRegions,然后当我得到一个locationManager:didUpdateToLocation:fromLocation:callback,我检查我跟踪集中的所有区域,看看我是不是不在inRegions集中,但现在在跟踪区域(添加到inRegions并使用enterRegion回调)或者如果我在inRegion但现在不是(从inRegions中删除并使用exitRegion回调)。现在正在进行中。
答案 1 :(得分:0)
您是否将CLLocationManagerDelegate
设置为ViewController?
@interface Maps : UIViewController <CLLocationManagerDelegate>{
...
}
答案 2 :(得分:0)
尝试使用调试 - &gt;位置 - &gt;高速公路驱动模拟,我有一个类似的问题,但我创建了一些区域,并且didEnterRegion被触发超过1.000米...我不知道方式..我已经设置:
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
locationManager.distanceFilter = kCLDistanceFilterNone;
答案 3 :(得分:0)
你为中心坐标做了什么?您的示例中缺少该部分。我已经看到了其他的例子,他们没有用足够精确的坐标和区域的半径来填充它,以便它能够触发。如果要在半径20米处触发,则必须输入一个非常精确的坐标(可能是5或6个小数)。
其他一切看起来都不错。
答案 4 :(得分:0)
您还需要在plist中使用NSLocationAlwaysUsageDescription,并且需要在您的应用中调用[locationManager requestAlwayAuthorization]。 NSLocationWhenInUseUsageDescription将关闭区域监控。