首次启动时仅在模拟器iPhone6中具有位置权限问题-XCode 9.4.1

时间:2018-08-30 22:02:37

标签: ios swift mapkit core-location

我有一个奇怪的问题。 仅在iPhone6模拟器中会出现此问题。 当我未经许可未经许可首次启动应用程序时,此代码将显示失败。这段代码位于主ViewController的ViewDidLoad中

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:致命错误:展开包装时意外发现nil   可选值

但是在其他任何模拟器或手机(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 :(得分:1)

在您的代码中,您将curLoc声明为一个隐式解包的可选内容,然后为其分配manager.location;但是manager.location是可选的,可以是nillocation可能是nil的原因有很多;设备需要花费一些时间来确定其位置,否则用户可能拒绝位置访问。

无论出于何种原因,当您随后访问curLoc包含nil时,都会得到一个异常,因为隐式解包的可选协定不会是nil。 / p>

您需要安全地解开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)
}