6

我已经设置了一个只有区域监控而没有其他功能的应用程序。我正在通过在前台模式下运行(而不是后台模式)进行测试。它在带有 ios 7.0.4 的 iphone 5 上运行。它启用了后台应用程序刷新和位置服务以及对此应用程序的位置授权。

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

我检查monitoredRegions以确保我要监视的区域是有效的,并且它是有效的。监测区域半径约100m。我使用 2 个模拟点,1 个在内部,1 个在不同的城市。我用于startMonitoringForRegion监视该区域。

我在这里错过了什么吗?

4

2 回答 2

8

确定区域监控的可用性

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

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

注意:即使应用程序没有被授权使用区域监控,它仍然可以注册区域以供以后使用。如果用户随后授予应用程序授权,则将开始对这些区域进行监控,并将生成后续的越界通知。如果您不希望区域在您的应用未获得授权时保持安装状态,您可以使用 locationManager:didChangeAuthorizationStatus: 委托方法来检测应用状态的变化并酌情删除区域。最后,如果您的应用需要在后台处理位置更新,请务必检查 UIApplication 类的 backgroundRefreshStatus 属性。您可以使用此属性的值来确定是否可以这样做,如果不能这样做,则警告用户。

有关更多信息,请参阅Apple 文档

为了防止虚假通知,iOS 在满足某些阈值条件之前不会发送区域通知。具体而言,用户的位置必须越过区域边界并从该边界移开最小距离,并在报告通知之前保持该最小距离至少 20 秒。

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

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

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

于 2014-07-23T06:32:03.897 回答
0

有点晚了,但我遇到了同样的问题。在这种情况下,我编辑了架构并将其设置为默认位置,从那里开始在模拟器中进行区域监控。

于 2015-10-20T15:40:13.587 回答