【问题标题】:UIBackgroundModes location and significant location changes with region monitoringUIBackgroundModes 位置和带有区域监控的显着位置变化
【发布时间】:2012-11-10 18:30:42
【问题描述】:

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

这是来自文档的引用:

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

...

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

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

我还尝试在没有 location 值的设备上运行该应用程序 UIBackgroundModes 键,它会继续报告重大的位置变化以及何时输入或退出区域。

另外,CLLocationManager Class Reference 中唯一提到 UIBackgroundModes 的地方是在 startUpdatingLocation 讨论中,我没有使用它。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    区域监控将在没有 location 键的情况下工作。事实上,区域监控将在没有启用任何特殊 iOS 键的情况下工作。

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

    【讨论】:

    • 我的意思是我没有使用startUpdatingLocation。非常感谢您的回答!
    • @AdamSwinden 我在我的应用程序中使用区域监控,并在后台模式下进行位置更新,所以如果我必须使用后台模式,我需要告诉评论中心。
    【解决方案2】:

    是的,如果您使用重大更改位置服务(startMonitoringSignificantLocationChanges)在后台和应用程序终止状态下监控用户位置,则必须在 Info.plist 的后台模式下添加“位置”键。

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 2012-06-11
      • 2012-03-22
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2017-08-09
      • 1970-01-01
      相关资源
      最近更新 更多