ABAddressBookGetAuthorizationStatus在设置中授权后被拒绝

时间:2015-09-27 02:36:02

标签: ios swift contacts

我正在尝试更优雅地处理拒绝的联系簿权限,但我发现了一个无法正常运行的方案。我正在运行Xcode 7和Swift 2.0。

首先,我解释为什么权限与应用体验相关,然后当他们决定允许时,他们可以点按一个带有电话的按钮:

ABAddressBookRequestAccessWithCompletion(nil) {
    (granted:Bool, err:CFError!) in
    if(granted){
        // Get contacts
    }
}

如果他们拒绝iOS权限对话框,我会在检查ABAddressBookGetAuthorizationStatus()之后使用以下代码提示他们:

func evaluateContactAccess(requestCompleted: (granted: Bool) -> ()) {
    let status = ABAddressBookGetAuthorizationStatus();
    switch status {
    case .Authorized:
        requestCompleted(granted: true);
    case .NotDetermined:
        ABAddressBookRequestAccessWithCompletion(nil) {
            (granted:Bool, err:CFError!) in
                requestCompleted(granted: granted);
        };
    case .Restricted, .Denied:
        let alertController = UIAlertController(
            title: "Contact Access Disabled",
            message: "Message about access here...",
            preferredStyle: .Alert)

        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
        alertController.addAction(cancelAction)

        let openAction = UIAlertAction(title: "Open Settings", style: .Default) { (action) in

            if let url = NSURL(string:UIApplicationOpenSettingsURLString) {

                UIApplication.sharedApplication().openURL(url)
            }
        }
        alertController.addAction(openAction)

        self.presentViewController(alertController, animated: true, completion: nil);

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "checkAndProceed", name: UIApplicationWillEnterForegroundNotification, object: nil)
    }
}

func checkAndProceed() {
    let status = ABAddressBookGetAuthorizationStatus()
    switch status {
    case .Authorized:
        // get contacts
    case .NotDetermined, .Restricted, .Denied:
        // debugger says status = .Denied at this point every time
    }
}

现在应用程序的iOS设置页面相应打开,用户有机会授予联系人访问权限。假设他们授予对联系人书籍的访问权限并切换回应用程序 - 无论我在应用程序恢复后调用ABAddressBookGetAuthorizationStatus()多少次,它总是返回ABAuthorizationStatus.Denied,就像它没有检测到用户更改一样在应用的iOS设置页面中获得授权的权限。

我为了以防万一而向Apple提交了一个错误,但我想知道是否有其他人有诀窍让这个工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

尽管我一再要求,但您没有充分了解您的代码是什么以及您的测试方式,所以此时我只能猜测。我的猜测是你的测试程序存在缺陷。在Xcode调试器中运行时,无法测试此功能。如果您取消设备并纯粹在设备上进行测试,您会发现当您从“设置”返回应用时,如果您的应用再次检查授权状态,则会获得授权状态。