Проблема с разрешением местоположения при первом запуске только в симуляторе 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)
}
Другие вопросы по тегам