iOS 7区域监控不';不能可靠地开火

iOS 7区域监控不';不能可靠地开火,ios,objective-c,geolocation,geofencing,Ios,Objective C,Geolocation,Geofencing,我已经安装了一个应用程序,只有地区监测,没有其他。我在前台模式下运行测试(与后台模式相反)。它运行在ios 7.0.4的iPhone5上。它已启用后台应用程序刷新和位置服务以及此应用程序的位置授权 我观察到一些非常奇怪的事情。当我使用模拟器跨越边界时,有时会调用didEnterRegion/didextregion。但有时候,不管我在模拟中切换边界多少次,它都不会被调用。在我更改模拟后,有时会很晚(几分钟)调用它 我检查了monitoredRegions,以确保要监视的区域是有效的,并且是有效的

我已经安装了一个应用程序,只有地区监测,没有其他。我在前台模式下运行测试(与后台模式相反)。它运行在ios 7.0.4的iPhone5上。它已启用后台应用程序刷新和位置服务以及此应用程序的位置授权

我观察到一些非常奇怪的事情。当我使用模拟器跨越边界时,有时会调用
didEnterRegion
/
didextregion
。但有时候,不管我在模拟中切换边界多少次,它都不会被调用。在我更改模拟后,有时会很晚(几分钟)调用它

我检查了
monitoredRegions
,以确保要监视的区域是有效的,并且是有效的。监测区域的半径约为100米。我使用了两个模拟点,一个在内部,一个在不同的城市。我使用
startMonitoringForRegion
来监视该区域


我在这里遗漏了什么吗?

确定区域监控的可用性

在尝试监视任何区域之前,应用程序应检查当前设备是否支持区域监视。以下是区域监控可能不可用的一些原因:

该设备没有必要的硬件来支持区域监控。 用户拒绝应用程序使用区域监视的授权。 用户在设置应用程序中禁用了位置服务。 用户在设置应用程序中禁用了设备或应用程序的后台应用程序刷新。 设备处于飞行模式,无法启动必要的硬件。 在iOS 7.0及更高版本中,在尝试监视区域之前,始终调用CLLocationManager的isMonitoringAvailableForClass:和authorizationStatus类方法。(在OS X v10.8及更高版本以及以前版本的iOS中,请改用regionMonitoringAvailable类。)isMonitoringAvailableForClass:方法告诉您底层硬件是否支持指定类的区域监视。如果该方法返回否,则您的应用程序无法在设备上使用区域监视。如果返回YES,请调用authorizationStatus方法以确定应用程序当前是否被授权使用位置服务。如果授权状态为kCLAuthorizationStatusAuthorized,则您的应用程序可以接收其注册的任何地区的跨境通知。如果授权状态设置为任何其他值,则应用程序不会收到这些通知

注意:即使应用程序未被授权使用区域监视,它仍然可以注册区域以供以后使用。如果用户随后向应用程序授予授权,则将开始对这些地区进行监控,并生成后续跨境通知。如果您不希望在应用未经授权的情况下保留安装的区域,您可以使用locationManager:didChangeAuthorizationStatus:delegate方法检测应用状态的更改,并根据需要删除区域。 最后,如果应用程序需要在后台处理位置更新,请确保检查UIApplication类的backgroundRefreshStatus属性。您可以使用此属性的值来确定是否可以这样做,如果不可以,则向用户发出警告。请注意,当后台应用程序刷新设置被全局禁用或专门针对您的应用程序禁用时,系统不会唤醒您的应用程序以获取区域通知

欲了解更多信息,请参阅

为了防止虚假通知,iOS在满足某些阈值条件之前不会发送区域通知。特别是,在报告通知之前,用户位置必须跨越区域边界并离开该边界至少20秒

具体阈值距离由当前可用的硬件和定位技术确定。例如,如果禁用Wi-Fi,则区域监控的准确性会明显降低。但是,出于测试目的,可以假设最小距离约为200米

注册授权应用程序后,立即开始监控地理区域但是,不要期望立即收到事件,因为只有边界过境点才会生成事件。特别是,如果用户的位置在注册时已经在区域内,则位置管理器不会自动生成事件。相反,在生成事件并将其发送给代理之前,您的应用程序必须等待用户跨越区域边界。要检查用户是否已在区域边界内,请使用CLLocationManager类的requestStateForRegion:方法


指定要监视的区域集时要谨慎。区域是共享的系统资源,系统范围内可用的区域总数有限。因此,核心位置将单个应用程序可同时监控的区域数量限制为20个。为了解决这个限制,考虑只注册用户附近的那些区域。随着用户位置的更改,您可以删除距离现在更远的区域,并添加用户路径上的区域。如果您试图注册一个区域,但空间不可用,则位置管理器将调用其委托的locationManager:monitoringDidFailForRegion:withError:方法,并显示kCLErrorRegionMonitoringFailure错误代码。

时间有点晚了,但我也遇到了同样的问题。在本例中,我编辑了模式并将其设置为默认位置,从那里开始在模拟器中进行区域监控。

查看一下,也许单元格边界与此有关。在Apple dev论坛上的帖子中,提到CLRegion monitorin的最小精度级别约为1公里