iOS后台模式位置更新 - 管理器不在后台模式下更新

dan*_*ean 2 ios swift2

我刚刚关注了http://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial位置更新部分.

但经理不会在后台模式下打印位置信息.

然后当app进入前台时,经理打印日志到Xcode的控制台.

这段代码对吗?

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

var window: UIWindow?
var manager = CLLocationManager()


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self
    manager.requestAlwaysAuthorization()
    manager.startUpdatingLocation()

    return true
}

func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
    if UIApplication.sharedApplication().applicationState != .Active {
        NSLog("App is backgrounded. New location is %@", newLocation)
    }
}
.....

}
Run Code Online (Sandbox Code Playgroud)

dan*_*ean 9

我自己得到了答案.

如果您的应用在iOS 9.0或更高版本上运行,并希望在后台运行您的位置服务应用,

你必须将allowsBackgroundLocationUpdates变量设置为true.

所以这是我的代码.

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

var window: UIWindow?
var manager = CLLocationManager()


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self
    manager.requestAlwaysAuthorization()
    manager.startUpdatingLocation()
    if #available(iOS 9.0, *){
        manager.allowsBackgroundLocationUpdates = true
    }   

    return true
}

func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
    if UIApplication.sharedApplication().applicationState != .Active {
        NSLog("App is backgrounded. New location is %@", newLocation)
    }
}
.....

}
Run Code Online (Sandbox Code Playgroud)