1

我已经写了这个程序,当应用程序显示在屏幕上时它就可以工作

如果应用程序在后台,它会停止打印纬度,当我恢复应用程序时,它会再次开始打印。

我在 xcode 中启用了后台模式,还检查Location updates了为什么我的应用程序仍然没有在后台运行?

如果应用程序正在运行,只是该print功能在后台不起作用,我怎么知道应用程序正在运行?

class ViewController: UIViewController,
    CLLocationManagerDelegate {

    var locationManager: CLLocationManager = CLLocationManager()
    var startLocation: CLLocation!

    func locationManager(_ manager: CLLocationManager,
                         didUpdateLocations locations: [CLLocation])
    {
        let latestLocation: CLLocation = locations[locations.count - 1]
        print(latestLocation.coordinate.latitude)    
    }

    override func viewDidLoad() {
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
        startLocation = nil

    }
}
4

2 回答 2

2

首先,你的问题:

locationManager.requestWhenInUseAuthorization()

这要求您的位置管理器仅在您的应用处于前台时更新其位置。您必须将其更改为:

locationManager.requestAlwaysAuthorization()

如果它仍然不起作用,请确保您的位置管理器通过在委托函数中添加打印语句来触发更新。

二、如何在后台打印东西:

我最喜欢的方法是在 UserDefaults 中记录内容,因为这些内容会在应用程序重新启动后持续存在。例如,我将我的打印语句设置为log键的值。重新启动后,我将从log密钥中读取 UserDefaults 的内容。

于 2017-05-08T04:05:27.493 回答
1

如果您的应用程序在后台使用位置)allowsBackgroundLocationUpdates。除了在Info.plist. 否则位置更新仅在前台传递。

如果首先调用 CLLocationManagerstartUpdatingLocation方法,并在 projectname-Info.plist 文件中添加必需Background Modes-> 应用程序注册位置更新。

于 2017-05-08T04:15:15.037 回答