Проблема с разрешением местоположения при первом запуске только в симуляторе iPhone6 - XCode 9.4.1
У меня есть одна странная проблема. Проблема возникает только в симуляторе iPhone6. Когда я запустил приложение в первый раз, без разрешения, то показать сбой в этом коде. Этот код находится в ViewDidLoad в главном ViewController
manager.delegate = self
manager.requestWhenInUseAuthorization()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.startUpdatingLocation()
var curLoc:CLLocation!
curLoc = manager.location
mapView.delegate = self
if (isLocationPermissionGranted() == false){
MapView.setRegion(MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 52.406464, longitude: 16.924997), span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
}else
{
MapView.setRegion(MKCoordinateRegionMake(CLLocationCoordinate2DMake(curLoc.coordinate.latitude, curLoc.coordinate.longitude), MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
}
let getJSON = JSONDownload()
getJSON.JSONDownloader(MapView: MapView)
}
В блоке else у меня ошибка
Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения
Но в любом другом симуляторе или моем телефоне (iPhone 6s, iOS 11.4.1) показывать только
Не удалось вставить юридическую атрибуцию из угла 4
Об этом сообщении я тоже немного запутался, потому что, полагаю, у меня есть все варианты разрешений.
Мое разрешение материала:
в Info.plist
Конфиденциальность - Расположение при использовании Описание использования
Конфиденциальность - Местоположение Использование Описание
В коде во ViewController
let manager = CLLocationManager()
Кроме того, у меня есть защита от локализованных ошибок:
func isLocationPermissionGranted() -> Bool{
guard CLLocationManager.locationServicesEnabled() else{
return false
}
return [.authorizedAlways, .authorizedWhenInUse].contains(CLLocationManager.authorizationStatus())
}
Есть ли шанс это исправить?:) Спасибо за ответ!:)
1 ответ
В вашем коде вы декларируете curLoc
как неявно развернутый необязательный, а затем присваивая manager.location
к этому; но manager.location
является необязательным и может быть nil
, Есть ряд причин, по которым location
может быть nil
; Устройству требуется время, чтобы определить свое местоположение, или пользователь может запретить доступ к местоположению.
Безотносительно причины, когда вы впоследствии получаете доступ curLoc
когда он содержит nil
вы получаете исключение, потому что контракт неявно развернутого необязательного является то, что он не будет nil
,
Вам нужно развернуть manager.location
безопасно, чтобы избежать аварии.
mapView.delegate = self
if let curLoc = manager.location, isLocationPermissionGranted() {
MapView.setRegion(MKCoordinateRegionMake(CLLocationCoordinate2DMake(curLoc.coordinate.latitude, curLoc.coordinate.longitude), MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
} else {
MapView.setRegion(MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 52.406464, longitude: 16.924997), span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
}