iPhone - 对地理围栏的疑问

7

我听说过地理围栏,但有些疑问。希望您能回答一些问题。

-它在iOS 5.1中是新功能,但是地理围栏和使用区域的区别是什么?从我所读到的来看,几乎相同,会耗费电池吗?

-为什么我找不到苹果关于地理围栏的文档?

-如何定义这些区域?我可以通过WebService远程添加吗?

谢谢。

2个回答

11

Geofencing自iOS 4以来就已经存在了。您可以在Apple位置感知编程指南中找到相关文档。它也被称为“区域监视”。

使用这些区域非常简单。使用中心点(纬度,经度)、半径和唯一标识符创建一个CLRegion,然后调用-startMonitoringForRegion。当然,您需要注册CLLocationManagerDelegate以便监听回调(-didEnterRegion-didExitRegion),但这也很容易做到。

您无法远程添加这些区域,只能从设备上添加。我在过去的几年中学到了一些关于它们的事情,因此希望这将节省您未来的一些麻烦。

  • 并非所有设备都能监视区域,请确保检查可用性。
  • 有最小和最大区域大小。如果您注册的区域超过或低于这些值,则会默认为最小/最大值。最小值为100米,最大值约为地球的三分之一大小。相当大。
  • 每个设备最多可以监视的区域数有上限。所有应用程序共享这个区域“池”,较旧的围栏将被清除以为新围栏腾出空间。所以要做好准备。最大数量接近100个。但是如果与Passbook应用,提醒和其他应用程序共享,则可能会很快用尽。
  • 请确保您只有一个位置管理器代理实例,多个实例将导致多个代理调用,它们都在监听。

Geofences是一种在不需要GPS或位置跟踪的情况下添加位置功能的好方法。据我的经验,即使始终开启,geofences也不会对电池寿命造成明显影响。苹果公司已经非常成功地解决了这个问题。它们的准确度不如主动GPS,但足够接近。祝你好运。

更新

这里的一些信息现在已经有点过时了。您现在可以监视的区域数量为20个,并且每个应用程序都有上限。此外,最小大小不是100M,它可能更小,但在较低数字下准确性不能保证。


谢谢你的回答,对我很有帮助。你能分享一下关于CLRegions准确性的经验吗?地理围栏是否仍需要最佳值,或者可能基于区域半径使用其他值? - beryllium
我仍然使用最佳准确性,对电池寿命影响很小。我注意到在iOS 6中,退出事件的时间似乎有所延迟。一切仍然按照广告宣传的方式工作,但退出事件可能不如以前那么准确。 - Bill Burgess
我想问一下您所说的最小100米是什么意思。我目前正在开发一个使用地理围栏的导航应用程序,但所需的精度大约为从某个点开始的10米。这是否意味着我必须使用其他方法来实现它? - user2429772
一个10M的地理围栏可能会有错误的签到记录。根据我的经验,100M(半径)是大多数情况下最好的选择。如果您需要更高的精度(如10M),您可能需要使用GPS,但这会消耗电池寿命。 - Bill Burgess

3

自iOS 4以来,“地理围栏”一直存在,以“区域监视”的形式存在。它使用距离检查来判断是否进入了圆圈。这不是真正的地理围栏,因为真正的地理围栏是检查一个点是否落在多边形内(称为点和多边形)。

截至iOS 6,目前没有类似于使用点和多边形的区域监视的东西。要进行真正的地理围栏,您需要同时使用区域监视和GPS。由于CoreLocation不支持地理围栏,因此没有苹果文档可用于地理围栏。

如果您要采取点-多边形方法,我建议使用射线投射。有一个Objective-C类实现得非常好。它被称为objc-BorderPatrol

至于从Web服务发送围栏,可能可以做类似于Twitter流API的事情,但那可能太过于繁琐。最好使用“显著位置”来更新您的围栏。如果您要从Web服务发送围栏,我建议使用MySQLPostGRE SQL,因为两者都具有非常好的地理空间扩展功能。

一些注意事项: - > -[CLRegion containsCoordinate:] 永远不会被任何 CoreLocation 对象调用。所有距离检查都是内部完成的。 - > 重要位置更新每500米或5分钟,以先到者为准。重要位置使用来自基站的 IP 地址来确定位置。 - > 地理围栏和区域可以重叠,请注意跟踪。

objc-BorderPatrol工作得完美吗?我想把它包含到我的应用程序中。 - hasan
objc-BorderPatrol 已不再维护。最好自己编写射线投射点多边形谓词以获得更好的服务。 - Nate Symer

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