我曾尝试过类似的过程,并且通过使用显著位置更改和区域监视来优化。经过多次迭代,我目前几乎没有在电池寿命方面受到影响,并且处理相当可靠。
我使用显著位置更改来触发一个方法,该方法过滤通知并设置仅限于当前位置有限半径内的区域。
根据我的经验,显著位置更改大约会相隔3-4英里。这可能会有很大的变化,但是我记不清有比那更多的情况。这使得在城镇周围处理非常少,当用户上高速公路时,处理变得相当可预测。我尝试了许多区域大小、刷新半径和位置服务灵敏度设置的变化。
请记住,您可以注册的区域数量是有限的。我没有找到确切的限制数字,但是一些用户指出任何单个应用程序不应期望注册超过10个区域。对我自己而言,我没有找到任何参考来证实这个数字,而且有时我会注册超过10个。
我尝试增加半径和最小距离以便在设备行驶较长时间的高速公路上看到刷新。在这种情况下,我感觉可能会浪费电池使用不必要的处理周期。在实际使用中,似乎并没有成为问题,但无论如何,我都在努力最大化效率。
就您的具体问题而言,我的经验是:
1- 对于您的情况,这取决于您打算考虑哪个位置作为触发器通知的接近程度。如果您在用户到达城镇时或离几英里处通知用户时,这可能是可行的。如果您希望在用户靠近几米的位置时触发,则不适用。根据我的经验,监听显著位置更改通常对电池寿命没有太大影响。当然,您在接收事件时进行多少处理和网络活动也是另一个因素。我检查设备移动了多远,上次接受位置以来的时间有多长。在我的情况下,不必每次刷新全部内容,我会相应地限制我的反应。
2- 我的重要位置更改的经验与上述相同,但所有文档都清楚地表明,这不仅仅是一组距离问题,而是与使用的各种信号的条件和可用性有关。我想在城市环境中,这更可预测,在广阔的空间中则较少。我的大多数经验都是在前者中获得的。
3- 通过广泛的谷歌搜索、研究文件以及大量的知情猜测,我得出结论,重要位置变化是由装置可用的所有信号的神奇组合决定的。有Wi-Fi信号以各种程度的准确度广播它们的位置,而蜂窝塔通常知道它们的位置。位置服务使用所有这些信息以及各自的信号强度来确定设备何时行进了“重要距离”。我认为很明显,这个计算会随着条件的变化而有所不同,并且会因为它们继续改善准确度和功率使用之间的平衡而发生变化,因此规格模糊。
4- 如问题1所示,有些因素需要考虑,可能决定你可以仅使用重要位置更改,但在任何情况下,我认为区域监视最适合您的目的。可能需要两者的组合。我为自己的应用程序使用它,感到非常满意。
5- 重要位置更改将唤醒您的应用程序。您必须遵循一些旨在在后台运行的方法的指南,并了解其限制。使用beginBackgroundTaskWithExpirationHandler和UIBackgroundTaskInvalid调用包装您的后台方法。注意线程阻塞。完整阅读文档和位置处理指南。
6- 我的建议如上所述。其他考虑因素是您对位置服务的整体使用。您需要制作某种定制处理程序。即使在使用服务时,您也不希望对每个接收到的消息做出反应。您必须检查更改、准确性、新近性以及所有相关的东西,仅在必要时做出响应。我发现这篇文章系列在基础方面非常有价值:来自长周末网站的第1部分
7- 如上所述,我的理解是系统范围内有一个可以注册的区域数量限制。我认为,由于他们没有告诉你确切的数字,这可能会允许您的应用程序更多或更少,具体取决于其他应用程序设置的数量。根据我的经验,在我的设定半径内,我经常注册和删除10到15个区域。我按照从最近到最远的顺序设置它们,因为我认为最后一个被添加的区域将被首先删除或拒绝。
其他考虑事项-区域标识符是全局的,因此如果您的不是唯一的,则会替换以前具有相同名称的区域。-区域大小和边距是需要实验来精细调整以满足您特定需求的设置。