monitoredRegions为空,即使调用了startMonitoringForRegion:desiredAccuracy:

时间:2012-01-25 15:26:58

标签: iphone ios5 xcode4.2 core-location

我正在开发在iOS5上运行的iPhone应用程序,当我点击按钮调用startMonitoringForRegion:desiredAccuracy:方法时无法设置地理围栏。

当我打印monitoredRegions中的区域时,它在模拟器中工作正常,但在实际的iPhone 4上运行时,monitoredRegions始终为空。预计也不会调用didEnterRegion:didExitRegion:方法。

另一个令人费解的事实是,在模拟器和iPhone 4设备上,也永远不会调用CLLocationManagerDelegate方法didStartMonitoringForRegion:

在此感谢您的帮助,谢谢!

编辑: 这是我点击按钮时调用的方法:

-(void) queueGeofence: (CLLocationCoordinate2D)selectedBranch userCoordinate:(CLLocationCoordinate2D)userCoordinate radius: (CLLocationDegrees)radius {
geofence = [[CLRegion alloc] initCircularRegionWithCenter:selectedBranch radius:radius identifier:@"geofence"];

CLLocationAccuracy acc = kCLLocationAccuracyNearestTenMeters;

[locationManager startMonitoringForRegion:geofence desiredAccuracy:acc];
[CLLocationManager regionMonitoringEnabled];

NSLog([CLLocationManager regionMonitoringEnabled] ? @"regionMonitoringEnabled:Yes" : @"regionMonitoringEnabled:No");
NSLog([CLLocationManager regionMonitoringAvailable] ? @"regionMonitoringAvailable:Yes" : @"regionMonitoringAvailable:No");

NSLog(@"LOCATIONMANAGER monitored regions: %@", [locationManager monitoredRegions]});
}

区域监控既启用又可用,但monitoredRegions仍然没有给我回复。

3 个答案:

答案 0 :(得分:3)

如果查看CLLocationManager.h,startMonitoringForRegion:desiredAccuracy:标题中的注释表明

  

如果已经为此应用程序监视了具有相同标识符的区域,则为   将从监控中删除。这是异步完成的,可能不会立即反映在monitoredRegions中。

因此,您不应期望[locationManager monitoredRegions]包含新添加的区域,因为它是异步添加的。

您是否正在为locationManager:monitoringDidFailForRegion:withError:实施委托方法?也许这会被调用而不是locationManager:didStartMonitoringForRegion:。另请注意,与现有区域具有相同标识符的区域将被删除,因此您可能会遇到一些意外问题,因为您正在重复使用"geofence"作为标识符。

答案 1 :(得分:1)

首先,您应确定您的应用有权使用LocationManager。在分配经理时检查它。

[CLLocationManager authorizationStatus];

启动应用程序并拒绝权限时遇到了同样的问题。删除并重建应用程序后。我有一面旗帜,该用户不接受它。打开它。

答案 2 :(得分:1)

如果您刚刚通过NSLog,它可能无法正常工作。 [locationManager monitoredRegions]返回CLRegions的NSSet。它们不会以这种方式显示在您的日志中。试试这个:

NSSet *setOfRegions = [locationManager monitoredRegions];
for (CLRegion *region in setOfRegions) {
   NSLog (@"region info: %@", region);
}