重大位置变化对地理围栏的影响

11

我需要根据用户与特定位置的距离以及其他规则(例如该区域是否有特定消息)来向用户传递特定消息。例如,当用户开车到达工作时,如果有要传递的消息,则在他到达工作地点时会收到一条消息。以下是我的想法(尚未编写代码,只是在设计流程时考虑):

  1. 监听重要位置更改事件,并在每次发生更改时将用户的地理位置发送到服务器,以查看是否有任何要在该位置附近传递的消息。但这样做会过于频繁使用无线电而导致电池损耗太大。

  2. 每天保存消息区域,并在每次重要位置更改时对本地存储的数据进行测试。如果有匹配项,则联系服务器。理论上听起来不错。

问题:

  1. 方案2可行吗?
  2. 重要位置更改的准确度如何?我不想因为没有接收到位置更改的通知而错过某个特定区域中的消息。
  3. 重要位置更改是否真的基于手机信号塔的变化?(我多次阅读过相关文章,但似乎并非如此)
  4. 区域监视是否更适合此任务?有人在使用吗?它会对电池寿命产生什么影响,并且准确度是否与重要位置更改相当或更好?
  5. 如果应用程序被终止,重要位置更改是否真的会唤醒我的应用程序?这在某种程度上是必须的。
  6. 您有没有关于如何以我在此处未提及的方式解决此问题的建议?

非常感谢任何花时间澄清这些问题的人。

编辑:额外问题 7. 区域监视,添加大量区域是否会对系统产生影响?例如添加2个区域与100个区域是否有区别?


消息从哪里来?它们是通过网络传递的吗?每天的新区域呢? - nevan king
3个回答

29

我曾尝试过类似的过程,并且通过使用显著位置更改和区域监视来优化。经过多次迭代,我目前几乎没有在电池寿命方面受到影响,并且处理相当可靠。

我使用显著位置更改来触发一个方法,该方法过滤通知并设置仅限于当前位置有限半径内的区域。

根据我的经验,显著位置更改大约会相隔3-4英里。这可能会有很大的变化,但是我记不清有比那更多的情况。这使得在城镇周围处理非常少,当用户上高速公路时,处理变得相当可预测。我尝试了许多区域大小、刷新半径和位置服务灵敏度设置的变化。

请记住,您可以注册的区域数量是有限的。我没有找到确切的限制数字,但是一些用户指出任何单个应用程序不应期望注册超过10个区域。对我自己而言,我没有找到任何参考来证实这个数字,而且有时我会注册超过10个。

我尝试增加半径和最小距离以便在设备行驶较长时间的高速公路上看到刷新。在这种情况下,我感觉可能会浪费电池使用不必要的处理周期。在实际使用中,似乎并没有成为问题,但无论如何,我都在努力最大化效率。

就您的具体问题而言,我的经验是:

1- 对于您的情况,这取决于您打算考虑哪个位置作为触发器通知的接近程度。如果您在用户到达城镇时或离几英里处通知用户时,这可能是可行的。如果您希望在用户靠近几米的位置时触发,则不适用。根据我的经验,监听显著位置更改通常对电池寿命没有太大影响。当然,您在接收事件时进行多少处理和网络活动也是另一个因素。我检查设备移动了多远,上次接受位置以来的时间有多长。在我的情况下,不必每次刷新全部内容,我会相应地限制我的反应。

2- 我的重要位置更改的经验与上述相同,但所有文档都清楚地表明,这不仅仅是一组距离问题,而是与使用的各种信号的条件和可用性有关。我想在城市环境中,这更可预测,在广阔的空间中则较少。我的大多数经验都是在前者中获得的。

3- 通过广泛的谷歌搜索、研究文件以及大量的知情猜测,我得出结论,重要位置变化是由装置可用的所有信号的神奇组合决定的。有Wi-Fi信号以各种程度的准确度广播它们的位置,而蜂窝塔通常知道它们的位置。位置服务使用所有这些信息以及各自的信号强度来确定设备何时行进了“重要距离”。我认为很明显,这个计算会随着条件的变化而有所不同,并且会因为它们继续改善准确度和功率使用之间的平衡而发生变化,因此规格模糊。

4- 如问题1所示,有些因素需要考虑,可能决定你可以仅使用重要位置更改,但在任何情况下,我认为区域监视最适合您的目的。可能需要两者的组合。我为自己的应用程序使用它,感到非常满意。

5- 重要位置更改将唤醒您的应用程序。您必须遵循一些旨在在后台运行的方法的指南,并了解其限制。使用beginBackgroundTaskWithExpirationHandler和UIBackgroundTaskInvalid调用包装您的后台方法。注意线程阻塞。完整阅读文档和位置处理指南。

6- 我的建议如上所述。其他考虑因素是您对位置服务的整体使用。您需要制作某种定制处理程序。即使在使用服务时,您也不希望对每个接收到的消息做出反应。您必须检查更改、准确性、新近性以及所有相关的东西,仅在必要时做出响应。我发现这篇文章系列在基础方面非常有价值:来自长周末网站的第1部分

7- 如上所述,我的理解是系统范围内有一个可以注册的区域数量限制。我认为,由于他们没有告诉你确切的数字,这可能会允许您的应用程序更多或更少,具体取决于其他应用程序设置的数量。根据我的经验,在我的设定半径内,我经常注册和删除10到15个区域。我按照从最近到最远的顺序设置它们,因为我认为最后一个被添加的区域将被首先删除或拒绝。

其他考虑事项-区域标识符是全局的,因此如果您的不是唯一的,则会替换以前具有相同名称的区域。-区域大小和边距是需要实验来精细调整以满足您特定需求的设置。

感谢您详细的回复。我想知道您是否可以至少提供一些咨询工作。如果是这样,请发送电子邮件至mihai at pocorschi dot com与我联系。谢谢。 - pocorschi
1
一个应用程序可以同时注册最多20个区域。在此处查看文档 - Bach
1
我记得当我开始的时候没有这样说。我看到他们还更新了一些关于4、4S和5之间性能差异的信息。如果你有兴趣,我已经将最新版本的处理程序放在Github上了。https://github.com/dsdavids/TTLocationHandler - Dean Davids

3
  1. 不要这样想。希望您从服务器获取数据,但是新增了区域。应用程序不会检查此区域,因为没有任何内容(在旧数据中)。即使该区域没有消息存在,如果收集所有可能的区域,则可以正常工作。这显然仅适用于预定义区域。
  2. 有关更多信息,请参见WWDC 2011视频 Session 500 ,从第17分钟开始。
  3. 自iOS5以来也使用WiFi(请参见视频)。
  4. 如果您已经知道区域,则绝对可以使用它们。例如,您可以向应用程序提供区域数组(每隔5分钟下载一次),并且仅当用户进入此区域时下载数据。请记住,当前所在的区域不会得到通知。确保定期更新当前区域的数据(如果它是一个相关消息的区域)。
  5. 是的,它将启动您的应用程序,无论它是在后台还是完全关闭。
  6. 您还可以下载所有消息,即使它们不在此区域内。只有在用户进入该区域时才显示它们/弹出窗口。但是,这仅适用于消息数据不是很多的情况。例如,如果您计划为所有人使用相同的消息(例如,“看看这座美丽的建筑”),则从整个世界下载所有数据将太多。
  7. 抱歉,我不知道。我猜它与创建日历事件相同,但我不确定。

那么你的意思是,无论是显著位置变化还是区域监测现在都只使用WiFi,并完全忽略了基站的变化? - pocorschi
不,我的意思是他们同时使用蜂窝网络和WiFi技术。 - user207616

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接