Ios 始终调用Swift LocationManager didChangeAuthorizationStatus

Ios 始终调用Swift LocationManager didChangeAuthorizationStatus,ios,swift,cllocationmanager,Ios,Swift,Cllocationmanager,我有一个视图控制器,它实现了CLLocationManagerDelegate。我创建了一个CLLocationManager变量: let locationManager = CLLocationManager() 然后在viewDidLoad中设置属性: // Set location manager properties locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccurac

我有一个视图控制器,它实现了
CLLocationManagerDelegate
。我创建了一个CLLocationManager变量:

let locationManager = CLLocationManager()
然后在
viewDidLoad
中设置属性:

// Set location manager properties
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.distanceFilter = 50
问题是,甚至在我检查授权状态之前,函数就被调用了

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if (status == .AuthorizedWhenInUse) {
        // User has granted autorization to location, get location
        locationManager.startUpdatingLocation()
    }
}

有人能告诉我是什么原因导致这种情况发生吗?

-locationManager:didchangearthorizationstatus:
在初始化
CLLocationManager
后不久被调用

如果需要,可以在委托方法内请求授权:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .notDetermined:
        locationManager.requestAlwaysAuthorization()
        break
    case .authorizedWhenInUse:
        locationManager.startUpdatingLocation()
        break
    case .authorizedAlways:
        locationManager.startUpdatingLocation()
        break
    case .restricted:
        // restricted by e.g. parental controls. User can't enable Location Services
        break
    case .denied:
        // user denied your app access to Location Services, but can grant access from Settings.app
        break
    default:
        break
    }
}
要知道,如果你想让这项工作起作用,你需要“及时”地指派代表


如果您以某种方式延迟了代理分配,例如通过异步设置,您可能会错过对
-locationManager:didChangeAuthorizationStatus:
Swift 3的初始调用

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case .notDetermined:
            manager.requestAlwaysAuthorization()
            break
        case .authorizedWhenInUse:
            manager.startUpdatingLocation()
            break
        case .authorizedAlways:
            manager.startUpdatingLocation()
            break
        case .restricted:
            // restricted by e.g. parental controls. User can't enable Location Services
            break
        case .denied:
            // user denied your app access to Location Services, but can grant access from Settings.app
            break
        }
    }

其他答案可能会导致新的不良行为

您只需添加一个布尔值和一个保护来防止第一次调用,并添加一些注释来解释错误:

var firstTimeCalled = true

// ...    

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

    guard !firstTimeCalled else {
        firstTimeCalled = false
        return
    }

    // ... send status to listeners
}

非常感谢你。我不知道初始化后会调用它。谢谢你的回答。苹果的文档需要更新这些信息。对我来说,这似乎是一个bug,我很难将其描述为授权状态的
didChange
。编写对授权状态的实际更改做出反应的代码会受到此行为的影响。@turingtested不幸的是,此函数不能完全忽略,因为它提供了跟踪授权状态更改的最佳方法。如果用户设置应用程序的背景,更改位置权限,然后重新打开应用程序,该功能将按预期方式工作。问题是该函数在初始化CLLocationManager时也会被调用,这真的毫无意义,而且是不幸的。在ios14中,不再调用此函数,因为它已被弃用。使用:
func locationmanagerdchangeauthorization(manager:CLLocationManager){如果可用(iOS 14.0,*){switch manager.authorizationStatus{…}}}
当我试图在swift 4中实现上述locationManager(:didChangeAuthorization:)方法时,为什么会说“无效的重新声明'locationManager(:didChangeAuthorization:)”。