我一直在努力让地理围栏工作,但似乎并没有发生。
我正在获取didStartMonitoringForRegion委托方法,但是当它们应该时,didEnterRegion和didExitRegion不会被调用。如果我将模拟器设置为1000公里以外,我可以将didExitRegion触发,但显然这不够准确。
我认为我必须错误地实现它,所以我从本教程下载了源文件: http://code.tutsplus.com/tutorials/geofencing-with-core-location--mobile-15477
但是,我得到了完全相同的行为(didStartMonitoringForRegion在实现时触发,但是不进入/退出),这让我觉得我的问题不在于代码。我在驾驶时在模拟器和实际设备上都尝试了它并且它不起作用。
我无法弄清楚我错过了什么!
答案 0 :(得分:0)
首先,您应该在要添加区域的类中实现此委托:
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
因此,您可以知道某个位置是否未能注册(可能是因为您提供了无效的坐标,或者您超出了您的应用可以注册的最大区域数)。
其次,当您在模拟器上测试它时,您需要使用GPX文件,模拟您向区域移动,而不仅仅是更改模拟器位置。
以下是走向曼哈顿中心的gpx文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<gpx>
<wpt lat="40.737181" lon="-73.98"></wpt>
<wpt lat="40.733604" lon="-73.992110"></wpt>
</gpx>
它会慢慢开始给出模拟器位置从路点1到路点2的更新。
您的航路点1应该在您正在监控的区域之外几英里处,理想情况下航点2应位于其中心。 您还可以在区域外添加第3个航点,以便再次获得退出通知。
由于模拟器模拟从航点到航路点的驾驶/步行,因此无法立即生效。您需要等几秒钟才能收到通知。
最后,作为提示,您需要检查所需的半径是否超过操作系统允许的最大半径,这是我添加监控区域的实现:
- (void)registerRegionWithenterPoint:(CLLocationCoordinate2D)centerPoint regionRadius:(CLLocationDistance)radius andIdentifier:(NSString*)identifier {
// If the radius is too large, registration fails automatically,
// so clamp the radius to the max value.
if (radius > self.locationManager.maximumRegionMonitoringDistance)
radius = self.locationManager.maximumRegionMonitoringDistance;
// Create the region and start monitoring it.
CLRegion* region = [[CLRegion alloc] initCircularRegionWithCenter:centerPoint radius:radius identifier:identifier];
[self.locationManager startMonitoringForRegion:region desiredAccuracy:(kSystemVersion>=6)?400:100];
}
常量kSystemVersion
只是iOS版本的常量,因为Apple建议根据操作系统版本使用不同的准确度级别。
尝试我的建议,看看是否有任何更新,但如果没有,请发布您的整个代码进行区域监控,因为您可能做错了什么,从您刚才说的我无法检测到