UIBackgroundModes位置和重要的位置变化与区域监测

时间:2012-11-22 11:04:10

标签: iphone objective-c ios core-location cllocationmanager

我有一个应用程序,它使用startMonitoringForRegion:startMonitoringSignificantLocationChanges的组合来了解应用程序在后台时用户的位置。这是否意味着我需要在location中包含UIBackgroundModes密钥的Info.plist值?

这是来自文档的引用:

  

对于不需要高精度位置数据的应用,强烈建议使用重要更改位置服务。使用此服务,仅当用户的位置发生显着变化时才会生成位置更新;因此,它非常适合为用户提供非关键的,与位置相关的信息的社交应用或应用。如果在更新发生时暂停应用程序,系统会在后台将其唤醒以处理更新。如果应用程序启动此服务然后终止,则系统会在新位置可用时自动重新启动应用程序。此服务在iOS 4及更高版本中可用,并且仅在包含蜂窝无线电的设备上可用。

     

...

     

为用户提供连续位置更新的应用程序(即使在后台)可以通过在其Info.plist文件中包含UIBackgroundModes键(具有位置值)来启用后台位置服务。在UIBackgroundModes键中包含此值并不妨碍系统暂停应用程序,但它确实告诉系统,只要有新的位置数据要传递,它就应该唤醒应用程序。因此,此密钥可以有效地让应用程序在后台运行,以便在它们发生时处理位置更新。

我对此的解释是,只有当应用需要连续的位置更新时才需要location键的UIBackgroundModes值,例如卫星导航应用。

我还尝试在没有location密钥UIBackgroundModes值的设备上运行该应用,并继续报告重要的位置更改以及输入退出的区域。

此外,CLLocationManager Class Reference中提及UIBackgroundModes的唯一位置是startUpdatingLocation讨论,我没有使用。

2 个答案:

答案 0 :(得分:16)

您对location密钥是正确的,只有在您的应用需要高精度位置更新时才需要它,即使在后台也是如此。像Runkeeper这样的东西使用它来允许它跟踪你的位置,即使你正在使用多任务的另一个应用程序。 From the docs for iOS Keys: UIBackgroundModes

  

“location”:该应用程序向用户提供基于位置的信息并要求   使用标准的位置服务(而不是   重要的变更位置服务)来实现这个功能。

  

如果存在在后台运行的替代方案,则应使用这些替代方案。例如,应用可以使用有意义的位置更改界面来接收位置事件,而不是注册为后台位置应用。

区域监控无需location密钥即可运行。事实上,区域监控无需启用任何特殊的iOS密钥即可运行。

您说您没有使用CLLocationManager,但如果您正在使用区域监控,则必须使用该类。您需要为应用设置位置管理器代理,以实际获取区域通知。

答案 1 :(得分:-1)

是的,如果您使用重要的更改位置服务(startMonitoringSignificantLocationChanges)来监视后台和app kill状态下的用户位置,则必须在Info.plist中的Backround模式下添加“location”键。