我有一个应用程序已经运行了好几年,但是位置服务在较新的iPhone上的iOS 13上无法正常工作。 在 7 及以下版本上工作正常。 初始化 CLLocationManager 时,不会调用 CLLocationManager: didChangeAuthorizationStatus 方法。
这是代码:
var firstMapLoad = true
let locationManager = CLLocationManager()
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.delegate = self
....
// MARK: - CLLocationManagerDelegate
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print ("locationManager: didChangeAuthorization called")
if (CLLocationManager.locationServicesEnabled()) {
switch status {
case .notDetermined:
// Request when-in-use authorization initially
locationManager.requestWhenInUseAuthorization()
print ("locationManager: notDetermined & requestWhenInUseAuthorization")
break
case .authorizedWhenInUse:
// Enable basic location features
locationManager.startUpdatingLocation()
print ("locationManager: authorizedWhenInUse & startUpdatingLocation")
break
case .authorizedAlways:
// Enable any of your app's location features
//enableMyAlwaysFeatures()
break
case .restricted, .denied:
//determine if system or app loc svcs disabled
print ("locationManager: restricted or denied")
noAppLocationService()
break
@unknown default:
print("locationManager: unknown authorization state")
}
}else{
viewOnlyMode()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let GPSAccuracy:CLLocation = locations[0] as CLLocation
print ("locationManager: didUpdateLocations")
if let location = locations.last?.coordinate {
if (currentLocation.latitude != location.latitude) || (currentLocation.longitude != location.longitude) {
self.currentLocation = location
GPSHorizontalAccuracy = GPSAccuracy.horizontalAccuracy
// print("LocManAccuracy: (GPSAccuracy.horizontalAccuracy)")
// print("LocManLatitude: (GPSAccuracy.coordinate.latitude)")
// print("LocManLongitude: (GPSAccuracy.coordinate.longitude)")
// print("LocManCurrLat: (currentLocation.latitude)")
// print("LocManCurrLong: (currentLocation.longitude)")
if firstMapLoad {
// Set the map’s center coordinate and zoom level.
let camera = GMSCameraPosition.camera(withTarget: self.currentLocation, zoom: 13)
self.viewMap?.animate(to: camera)
firstMapLoad = false;
}
}
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Location Error = (error.localizedDescription)")
}
当我在 Xcode 中的 iPhone 11 Pro Max 模拟器上运行它时,如果 iPhone 模拟器已重置并首次运行该应用程序,我会收到包含 3 个选项的授权警报。 我选择"使用时",应用程序工作正常 - didChangeAuthorization 函数被调用两次(一次在初始化位置管理器时,然后在我选择"使用时"时(。然后调用didUpdateLocations,应用获取位置更新。
如果我停止应用程序,请将其从模拟器中删除,然后从 Xcode 重新运行 该应用程序不会请求定位服务的用户权限。 当位置管理器初始化时,不会调用 didChangeAuthorization,因此不会启动位置服务,并且应用程序不会收到任何位置更新。 我在真正的iPhone 11 Pro上观察到了相同的行为。
我尝试在应用程序位置设置中将应用程序的权限设置为"从不",停止应用程序,然后在模拟器上删除应用程序。 当我下次从 Xcode 运行时,该应用程序没有要求位置权限,但确实显示了一个警报,指出位置服务已禁用。 即使删除了该应用程序,似乎也保留了以前安装的设置。
就我而言,代表的方法签名对于iOS 14+是错误的
iOS<=13,在 iOS 14 中已弃用
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
iOS 14+
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager)
如果您的目标是 iOS <14,则应同时实现两者