CLAuthorizationStatus AuthorizedWhenInUse 仅在第一次调用

CLAuthorizationStatus AuthorizedWhenInUse called only for the first time

如果我在应用程序第一个视图控制器加载后不请求 "AuthorizedWhenInUse" 状态,就会出现问题,之后我将永远无法更新。

假设我有一个地图视图控制器。当我在 viewDidLoad 方法中请求状态时,它会更新我的位置,即调用 func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!)

现在我添加了一个介绍视图控制器,一旦用户完成介绍 he/she 就会转到旧地图控制器。但是现在 func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) 不再被调用了!

我注意到,如果我转到设置并为我的应用程序手动切换授权状态,然后返回到我的应用程序,则会调用 didUpdateLocations

class MapViewController: UIViewController, CLLocationManagerDelegate {

    private let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.distanceFilter = 100
        locationManager.delegate = self
        // >=iOS8
        if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
            locationManager.requestWhenInUseAuthorization()
        } else {
            locationManager.startUpdatingLocation()
        }
    }

    // MARK: - CLLocationManagerDelegate

    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        if status == .AuthorizedAlways || status == .AuthorizedWhenInUse {
            manager.startUpdatingLocation()
        }
    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        if let location = locations.first as? CLLocation {
            println("User's location: \(location.description)")
        } else {
            println("User's location is unknown")
        }
    }

}

我发现您发布的内容有几个问题,这里只有两个:

  1. 您正在从 viewDidLoad 调用 locationManager.startUpdatingLocation() 这只会在视图尚未加载到内存中时触发。建议将其移至 viewWillAppear 以便每次都会触发。
  2. 这段代码应该重写:

        if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
            locationManager.requestWhenInUseAuthorization()
        } else {
            locationManager.startUpdatingLocation()
        }
    

您需要检查 authorizationStatus,如果它是 kCLAuthorizationStatusNotDetermined,则使用上面的 if 语句请求许可。如果您不这样做,iOS 8 个用户将始终进入 requestWhenInUseAuthorization 部分。您不希望这样,因为 OS 只会请求一次许可。它不会再次询问,除非您将手机放在“设置”下的“位置隐私”。