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")
}
}
}
我发现您发布的内容有几个问题,这里只有两个:
- 您正在从
viewDidLoad
调用 locationManager.startUpdatingLocation()
这只会在视图尚未加载到内存中时触发。建议将其移至 viewWillAppear
以便每次都会触发。
这段代码应该重写:
if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}
您需要检查 authorizationStatus
,如果它是 kCLAuthorizationStatusNotDetermined
,则使用上面的 if 语句请求许可。如果您不这样做,iOS 8 个用户将始终进入 requestWhenInUseAuthorization
部分。您不希望这样,因为 OS 只会请求一次许可。它不会再次询问,除非您将手机放在“设置”下的“位置隐私”。
如果我在应用程序第一个视图控制器加载后不请求 "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")
}
}
}
我发现您发布的内容有几个问题,这里只有两个:
- 您正在从
viewDidLoad
调用locationManager.startUpdatingLocation()
这只会在视图尚未加载到内存中时触发。建议将其移至viewWillAppear
以便每次都会触发。 这段代码应该重写:
if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) { locationManager.requestWhenInUseAuthorization() } else { locationManager.startUpdatingLocation() }
您需要检查 authorizationStatus
,如果它是 kCLAuthorizationStatusNotDetermined
,则使用上面的 if 语句请求许可。如果您不这样做,iOS 8 个用户将始终进入 requestWhenInUseAuthorization
部分。您不希望这样,因为 OS 只会请求一次许可。它不会再次询问,除非您将手机放在“设置”下的“位置隐私”。