10

我需要根据用户与特定位置的接近程度和其他一些规则(例如该区域是否有任何特定消息)向用户传递特定消息。例如,用户上车并开始工作。当他到达工作地点的那一刻,如果有消息要传递,他就会收到某种消息。这就是我的想法(没有代码,只是在我在应用程序的其他部分工作时尝试设计流程)

  1. 监听重大的位置变化,每次发生这种情况时将用户的地理位置发送到服务器,以查看该位置附近是否有任何消息要传递。不去。由于过度使用收音机,这会过多地消耗电池。

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

问题:

  1. 2号能用吗?
  2. 显着位置变化的保真度是多少?我不希望通过不收到位置更改通知而丢失特定区域的消息。
  3. 重大的位置变化真的基于蜂窝塔的变化吗?(我多次读到不是)
  4. 区域监控会更适合这项任务吗?有人用吗?它的电池消耗是多少?它对显着位置变化有更好的或同等的保真度吗?
  5. 如果应用程序被终止,重大的位置变化真的会唤醒我的应用程序吗?有点取决于它。
  6. 关于如何以我在这里没有谈到的方式处理这个问题的任何建议?

一百万感谢任何花时间清理这些东西的人。

编辑:额外问题 7. 区域监控,添加大量区域对系统有什么影响?说有 2 个区域与 100 个区域?

4

3 回答 3

27

我已经尝试了一个类似的过程,并通过显着的位置变化和区域监控达到了我的最佳用途。经过多次迭代,我目前对电池寿命和相当可靠的处理几乎没有影响。

我使用显着的位置更改来触发过滤通知的方法,仅为当前位置有限半径内的那些设置区域。

根据我的经验,预计相距约 3-4 英里的位置会发生重大变化。这可能会有很大差异,但我不记得看到更多。这使得城镇周围的处理非常少见,当用户上高速公路时相当可预测。我尝试了多种区域大小、刷新半径和位置服务敏感度设置。

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

当看到设备以高速行驶很长时间时,我已经尝试增加刷新的半径和最小距离。在这种情况下,我觉得我可能会因为不必要的处理周期而浪费电池。在实际使用中,这似乎不是问题,但无论如何我都在努力最大限度地提高效率。

我的经验与您的具体问题有关;

1-对于您的情况,这取决于您打算考虑触发通知的位置有多近。如果您在用户到达几英里内或用户到达城镇时通知您,这实际上可能是可行的。如果您想在用户到达某个位置几米范围内时触发,那么这不适合您。根据我的经验,聆听重大的位置变化通常不会对电池寿命造成很大影响。当然,您在收到事件后进行了多少处理和网络活动是另一个因素。我检查设备移动了多远,自上次位置被接受以来的时间。就我而言,没有必要每次都刷新所有内容,我会相应地限制我的反应。

2- 我对重大位置变化的经验如上所述,但所有文件都清楚地表明,设定距离与所使用的各种信号的条件和可用性无关。我想在城市环境中它更容易预测,而在开阔的空间中则更少。我的大部分经验都属于前者。

3- 从大量的谷歌搜索、大量的文档和大量有根据的推测中,我得出结论,显着的位置变化是由单元可用的所有信号的神奇组合决定的。有 wifi 信号可以以不同程度的准确度广播它们的位置,并且手机信号塔通常知道它们在哪里。定位服务正在使用所有这些以及各自的信号强度来决定设备何时行进了“重要距离”。我认为很明显,计算会随着条件的变化而变化,并且随着它们继续改善准确性和功耗之间的平衡而发生变化,因此规格模糊。

4- 如问题 1 所示,有一些因素需要考虑,这些因素可能会决定您可以单独使用重大的位置更改,但我相信区域监控在任何情况下都最适合您的目的。可能两者的结合是有序的。我对自己的应用程序非常满意。

5- 重大的位置变化会唤醒您的应用。在您的方法中,您必须遵循一些旨在在后台运行的准则,并了解这些限制。在 beginBackgroundTaskWithExpirationHandler 和 UIBackgroundTaskInvalid 调用中包装你的后台方法。注意线程阻塞。完整阅读文档和位置处理指南。

6-我的建议如上。其他注意事项一般是在您使用定位服务时。您需要制作各种自定义处理程序。即使您使用该服务,您也不想对收到的每条消息做出反应。您必须根据需要检查变化、准确性、新近度和所有爵士乐响应。我发现这一系列文章对于了解基础知识非常宝贵:来自 Long Weekend 网站的第 1 部分,共 3 部分

7- 如上所述,我的理解是系统范围内可以注册的区域数量有限制。我认为,由于他们没有确切地告诉您该数字是多少,它可能或多或少地允许您的应用程序取决于其他应用程序设置了多少其他应用程序。根据我的经验,我经常在我设定的范围内注册和删除 10 到 15 个区域。我将它们按从最近到最远的顺序设置,因为我假设最后一个将首先被删除或拒绝。其他注意事项-区域标识符是全局的,因此如果您的标识符不是唯一的,它将用相同的名称替换先前的区域。- 区域大小和边距是您需要试验的设置,以针对您的特定需求进行最佳调整。

于 2012-07-29T16:38:59.647 回答
3
  1. 不要这么想。期望您从服务器获取数据,但随后添加了一个区域。应用程序不会检查该区域,因为不存在任何东西(在旧数据中)。如果您收集所有可能的区域,即使该区域不存在消息,它也可以工作。这显然只适用于预定义的区域。
  2. 有关更多信息,请参阅WWDC 2011 视频Session 500从 17 分钟开始。
  3. 不,自 iOS5 以来它也在使用 WiFi(参见视频)。
  4. 绝对如果你已经知道这些地区然后使用它们。你可以例如。为应用程序提供一系列区域(每 5 分钟左右下载一次),并且仅在用户点击该区域时才下载数据。请记住,您当前所在的区域不会收到通知。确保定期更新当前区域的数据(如果是消息相关区域)
  5. 是的,它会在后台或完全关闭时启动您的应用程序。
  6. 即使它们不在该区域,您也可以下载所有消息。并且仅在用户点击该区域时才显示/弹出。但这只有在消息数据不多的情况下才有可能。例如,如果您计划对所有人使用相同的消息(例如,“看看这座美丽的建筑”),那么从全世界下载所有数据就太过分了。
  7. 抱歉不知道。我想它就像创建日历事件一样,但我不确定。
于 2012-07-23T11:11:12.720 回答
0

对于#3:

我已经在 WiFi 关闭的情况下测试了 Android 4.3 地理围栏,发现它工作正常!

有新增的硬件地理围栏和 Wi-Fi 仅扫描模式可以提供帮助。

参考:http: //developer.android.com/about/versions/jelly-bean.html#43-optimized-location

于 2014-03-21T19:37:20.670 回答