在块中调用时未进行CLLocationManager auth请求

时间:2016-12-13 08:46:57

标签: ios swift cllocationmanager uialertcontroller completion-block

我的身份验证请求方法存在以下问题:

    func requestAuthorisation() {
        if CLLocationManager.authorizationStatus() == .NotDetermined {
            let locationPermissionRequest = UIAlertController.init(title: "Location services", message:  "Some message, hidden for obvious reasons...", preferredStyle: .Alert)
            let alwaysOnButton = UIAlertAction.init(title: "Always on (recommended)", style: .Default, handler: { (alert: UIAlertAction!) in
                locationPermissionRequest.dismissViewControllerAnimated(true, completion: {
                    self.locationManager.requestAlwaysAuthorization()
                })
            })
            let backgroundButton = UIAlertAction.init(title: "On when in use", style: .Default, handler: { (alert: UIAlertAction!) in
                locationPermissionRequest.dismissViewControllerAnimated(true, completion: {
                    self.locationManager.requestWhenInUseAuthorization()
                })
            })
            let noButton = UIAlertAction.init(title: "Off", style: .Destructive, handler: { (alert: UIAlertAction!) in
                locationPermissionRequest.dismissViewControllerAnimated(true, completion: nil)
            })
            locationPermissionRequest.addActions(withActions: [alwaysOnButton, backgroundButton, noButton])
            locationPermissionRequest.present(true, completion: nil)
        }
    }

这里的问题是,当我点击使用时按钮或始终按钮时,他们的动作被调用并且警报被取消但是永远不会请求位置认证。我在创建auth请求的行上放置了一个断点,并且正在调用方法。有趣的是,如果我将调用auth方法从它们各自的完成块移出,那么它工作正常,但出于我的目的,我需要在我的自定义警报被解除之前不调用它们。

有谁知道为什么我会看到这种行为/知道修复?

修改

我只是试图在主线程上调用发送,因为我有一个潜在的怀疑,这是一个线程问题,但唉,事实并非如此。

1 个答案:

答案 0 :(得分:0)

我知道这是一个很老的问题,但是我较早就遇到了这个问题,想提出什么解决方法。

警报控制器绑定到位置管理器CLLocationManager对象。如果您没有将对象放在身边,那么在用户点击它之前,auth警报控制器将不会显示或消失。

我不确定是否是上面的代码是否有问题,因为我不确定locationManager的实际范围是什么,但这以类似的症状解决了我的问题。