首页 > 解决方案 > 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
            }
        }
    }
    
    
}

标签: ioserror-handlingswiftuilocationcore-location

解决方案


推荐阅读