У меня есть приложение, которое отлично работает уже несколько лет, но службы определения местоположения не работают должным образом для iOS 13 на новых iPhone. Прекрасно работает на 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)")
}
Когда я запускаю его на симуляторе iPhone 11 Pro Max в Xcode, Если симулятор iPhone был сброшен и приложение запускалось в первый раз, я получаю предупреждение об авторизации с тремя вариантами. Я выбираю «при использовании», и приложение работает нормально - функция didChangeAuthorization вызывается дважды (один раз при инициализации диспетчера местоположения, а затем при выборе «при использовании»). Затем вызывается didUpdateLocations, и приложение получает обновления местоположения.
Если я останавливаю приложение, удаляю его из симулятора, а затем повторно запускаю из Xcode, приложение не запрашивает разрешения пользователя для служб определения местоположения. didChangeAuthorization не вызывается при инициализации диспетчера местоположения, поэтому службы определения местоположения не запускаются, и приложение не получает никаких обновлений местоположения. Я наблюдал такое же поведение на реальном iPhone 11 Pro.
Я попытался установить для приложения разрешение «никогда» в настройках местоположения приложения, остановил приложение, а затем удалил приложение на симуляторе. . Когда я в следующий раз запустил Xcode, приложение не запрашивало разрешения на определение местоположения, но отображало предупреждение о том, что службы определения местоположения отключены. Похоже, что настройки из предыдущей установки были сохранены, даже если приложение было удалено.