首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 7区域监控无法可靠启动

iOS 7区域监控无法可靠启动
EN

Stack Overflow用户
提问于 2013-12-07 07:28:35
回答 2查看 1.6K关注 0票数 6

我已经设置了一个应用程序,只有地区监测,没有其他。我是通过在前端模式(而不是后台模式)下运行来测试的。它运行在装有ios 7.0.4的iPhone5上。它启用了后台应用程序刷新和定位服务以及对此应用程序的位置授权。

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

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

我是不是漏掉了什么?

EN

回答 2

Stack Overflow用户

发布于 2014-07-23 14:32:04

确定地域监控的可用性

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

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

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

有关更多信息,请参阅Apple docs

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

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2015-10-20 23:40:14

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20435412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档