ios - SwiftUI:尝试更改位置授权时出错
问题描述
我目前有这段代码,我可以在其中获取用户的当前位置,然后将其显示在地图上。这似乎工作正常。但是当用户按下“使用中允许”然后进入设置并将其更改为“下次询问”时,我的应用程序崩溃了。当发生这种情况时,我会收到以下错误
错误:操作无法完成。(kCLErrorDomain 错误 1。)
和
<MKCoreLocationProvider: 0x600002d803f0> 的 CLLocationManager(<CLLocationManager: 0x600001d84740>) 确实失败并出现错误:Error Domain=kCLErrorDomain Code=1 "(null)"
我没有很多经验,但我怀疑问题出在第 3 行。我想我应该使用@StateObject。但我可能完全错了。
如果它不是第 3 行,它可能来自我评论过的地方Checking authorization status...
。但老实说我不知道
关于问题是什么的任何想法?
顺便说一句,我已将所有必要的“东西”添加到我的 info.plist
struct Home: View{
@State var tracking : MapUserTrackingMode = .follow
// This line could be the issue
@State var manager = CLLocationManager()
@StateObject var managerDelegate = locationDelegate()
var body: some View {
VStack{
Map(coordinateRegion: $managerDelegate.region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $tracking, annotationItems: managerDelegate.pins) { pin in
MapPin(coordinate: pin.location.coordinate, tint: .red)
}.edgesIgnoringSafeArea(.all)
}.onAppear{
manager.delegate = managerDelegate
manager.distanceFilter = kCLDistanceFilterNone
print("On Appear")
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.activityType = .automotiveNavigation
}
.alert(isPresented: $managerDelegate.locationPermissionDenied, content: {
Alert(title: Text("Permission Denied"),
message: Text("Please Enable Permission In App Settings"),
dismissButton: .default(Text("Go To Settings"),
action: {
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
}))
})
}
}
class locationDelegate: NSObject,ObservableObject,CLLocationManagerDelegate{
@Published var pins : [Pin] = []
@Published var location: CLLocation?
@State var hasSetRegion = false
@Published var locationPermissionDenied = false
@Published var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 38.898150, longitude: -77.034340),
span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1)
)
// Checking authorization status...
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .denied :
// Alert
locationPermissionDenied = true
print("Denied")
print(locationPermissionDenied)
case .restricted:
print("restricted")
case .notDetermined:
// Request
print("not Determined")
manager.requestWhenInUseAuthorization()
case .authorizedWhenInUse :
print("Authorized when in use")
manager.allowsBackgroundLocationUpdates = true
manager.startUpdatingLocation()
default:
print("Default")
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error : Error){
print("Error: \(error.localizedDescription)")
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// pins.append(Pin(location:locations.last!))
if let location = locations.last {
print("Latitude: \(location.coordinate.latitude)")
print("Longitude: \(location.coordinate.longitude)")
self.location = location
if hasSetRegion == false{
region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 0.001, longitudeDelta: 0.001))
hasSetRegion = true
}
}
}
}
解决方案
推荐阅读
- jenkins - Jenkins Free style Job 中调用 ansible-playbook 的权限被拒绝消息
- amp-html - 使用 amp-state 时 [text] 中的 HTML 文本
- javascript - 如何实现上滑效果并重定向到另一个html页面
- c# - 为非常大的 xml 文件估计 c# 中的迭代元素
- python - 从嵌套列表和元组列表中获取所有 unqiue 字符串
- sublimetext3 - Sublime Text 3 日文字符与其他字符不符
- javascript - 整个条形图的 Google Charts 堆积条形图/柱形图注释
- android - Do I need to check the box Backwards Compatibillity (AppCompat) in Android Studio 3.2.1?
- google-app-engine - what is the entity group of root entity in GAE?
- node.js - Cannot find module 'react-dev-utils/crossSpawn' exception React App