后台持续获取iOS位置更新

4
我正在尝试创建一个简单的iOS应用程序,以在后台持续跟踪位置,并在用户进入特定区域时高精度通知(不希望使用区域监控,因为它对于我想做的事情来说不够准确或快速)。
这个应用程序在前台运作良好,但一旦进入后台就无法工作。
我创建了一个测试应用程序来研究后台位置更新如何工作。我制作了一个简单的应用程序,当发生位置更新时(到日志中)只需打印出消息即可。
我看到的是,在前台模式下,位置更新按预期发生,但当我锁定手机并且应用程序切换到后台时,位置更新大约持续30秒然后停止。在Apple文档中没有提及关于这种行为的说明(据我所知)。
我确保在info.plist中启用了后台处理(在“capabilities”->“background modes”->“location updates”完成)。
以下是我用来测试的代码:
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秒内,我收到了通知,然后它们停止了。 - Morocco5
另外,为了明确起见,我在info.plist中允许了位置后台处理模式。 - Morocco5
3个回答

4
你需要在你的plist文件中添加这个内容:
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

添加这个

locationManager.allowsBackgroundLocationUpdates = true

感谢回复。我已经在我的info.plist中设置了这个(如上所述,但接近结尾)。为了双重检查,我查看了原始文件,我确实看到了这个(如预期):<key>UIBackgroundModes</key> <array> <string>location</string> </array> - Morocco5

2
我认为这可能是答案:allowsBackgroundLocationUpdates
引用如下:
应用程序想要在挂起时接收位置更新,必须在其应用程序的Info.plist文件中包含UIBackgroundModes键(具有位置值),并将此属性的值设置为true。
...
该属性的默认值为false。
你是否设置了它?

是的,正在进行设置。 - Morocco5
你提到了锁定手机。如果您不锁定手机,而只是回到主屏幕将应用程序置于后台,是否会发生同样的事情? - clarus
它在手机解锁状态下运行良好。只有在后台才会被挂起。但是添加“allowsBackgroundLocationUpdates”使其正常工作。 - Morocco5
哦,我以为你在我上面提到的时候已经设置好了。无论如何,很高兴你搞定了。 - clarus
我在info.plist中包含了正确的密钥设置,但我错过了您提到的allowsBackgroundUpdates(起初没有意识到它们是两个不同的东西)。 直到后来我才意识到您也回答了我的问题。 感谢您的帮助。 - Morocco5

0
你可以添加这两行来使其在后台模式下工作:
locationManager!.allowsBackgroundLocationUpdates = true
locationManager!.pausesLocationUpdatesAutomatically = false

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