我有一个奇怪的问题。 仅在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())
}
有机会修复它吗? :) 感谢您的回答! :)
答案 0 :(得分:1)
在您的代码中,您将curLoc
声明为一个隐式解包的可选内容,然后为其分配manager.location
;但是manager.location
是可选的,可以是nil
。 location
可能是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)
}