Проблема с разрешением местоположения при первом запуске только в симуляторе iPhone6 ​​- XCode 9.4.1 - PullRequest
0 голосов
/ 31 августа 2018

У меня есть одна странная проблема. Проблема возникает только в симуляторе 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 Ответ

0 голосов
/ 31 августа 2018

В своем коде вы объявляете 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)
}
...