startMonitoringForRegion不能正常工作,但实现得当

时间:2014-03-09 08:14:00

标签: ios core-location geofencing

我一直在努力让地理围栏工作,但似乎并没有发生。

我正在获取didStartMonitoringForRegion委托方法,但是当它们应该时,didEnterRegion和didExitRegion不会被调用。如果我将模拟器设置为1000公里以外,我可以将didExitRegion触发,但显然这不够准确。

我认为我必须错误地实现它,所以我从本教程下载了源文件: http://code.tutsplus.com/tutorials/geofencing-with-core-location--mobile-15477

但是,我得到了完全相同的行为(didStartMonitoringForRegion在实现时触发,但是不进入/退出),这让我觉得我的问题不在于代码。我在驾驶时在模拟器和实际设备上都尝试了它并且它不起作用。

我无法弄清楚我错过了什么!

1 个答案:

答案 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建议根据操作系统版本使用不同的准确度级别。

尝试我的建议,看看是否有任何更新,但如果没有,请发布您的整个代码进行区域监控,因为您可能做错了什么,从您刚才说的我无法检测到