【问题标题】:continuous iOS location updates in background在后台持续更新 iOS 位置
【发布时间】:2018-03-11 22:35:42
【问题描述】:

我正在尝试创建一个简单的 iOS 应用程序,它将在后台持续跟踪位置并在用户进入特定区域时以高精度通知(不想使用区域监控,因为它不够准确或不够快我想要什么)。

这个应用程序在前台运行良好,但一旦我进入后台,它就无法运行。

我创建了一个测试应用来研究后台位置更新的工作原理。我做了一个简单的应用程序,当位置更新发生时(到日志)打印出一条消息。

我看到的是,在前台模式下,更新按预期进行,但是当我锁定手机并且应用切换到后台时,位置更新会持续大约 30 秒然后停止。 Apple 文档(我可以找到)中没有提及解释此行为。

我确保在 info.plist 中启用了后台处理(在“功能”->“后台模式”->“位置更新”中完成)

这是我用来测试的代码:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

let locationManager = CLLocationManager() 
var counter = 0
override func viewDidLoad() {
    super.viewDidLoad()

    // configure location updates
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = 0.1
    locationManager.pausesLocationUpdatesAutomatically = false

    locationManager.requestAlwaysAuthorization()

    locationManager.startUpdatingLocation()

}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("location updated! \(counter)")
    counter = counter + 1
}

对我可能遗漏的内容有什么想法吗?我尝试了不同的定位精度设置(例如 BestForNavigation 等),没有任何变化。

谢谢。

【问题讨论】:

  • 我想澄清一下,为了在后台测试位置更新,打印语句将不起作用(只有在应用程序处于前台时打印到 Mac 才能起作用)。为了测试它,我添加了一些代码来在 didUpdateLocations 中发送本地通知。当我切换到后台时,只要位置更新,就会向我发送通知。切换到后台后,我收到了大约 30 秒的通知,然后它们就停止了。
  • 另外,需要明确的是,我允许 info.plist 中位置的后台处理模式

标签: ios iphone location core-location


【解决方案1】:

你必须在你的 plist 中添加这个:

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

添加这个

locationManager.allowsBackgroundLocationUpdates = true

【讨论】:

  • 感谢您的回复。我的 info.plist 中已经有了这个设置(上面提到但接近尾声)。作为仔细检查,我查看了原始文件,我确实看到了(如预期的那样): UIBackgroundModeslocation
【解决方案2】:

我认为这可能是答案: allowsBackgroundLocationUpdates.

希望在暂停时接收位置更新的应用必须包括 他们应用程序中的 UIBackgroundModes 键(带有位置值) Info.plist 文件并将此属性的值设置为 true。

...

此属性的默认值为 false。

你在设置吗?

【讨论】:

  • 是的,正在设置中。
  • 您提到锁定手机。如果您不锁定手机,而只是转到主屏幕以后台应用程序,是否会发生同样的事情?
  • 它在手机解锁的情况下工作正常。只有在后台才会暂停。但添加“allowsBackgroundLocationUpdates”使其工作。
  • 哦,我以为你说你在设置时我上面提到它。不管怎样,很高兴你能成功。
  • 我在 info.plist 中包含了正确的键设置,但我错过了您提到的allowBackgroundUpdates(起初没有意识到它们是两个不同的东西)。直到后来我才意识到你也回答了我的问题。感谢您的帮助。
【解决方案3】:

您可以添加这两行使其在后台模式下工作:

locationManager!.allowsBackgroundLocationUpdates = true
locationManager!.pausesLocationUpdatesAutomatically = false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多