Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ABAddressBookGetAuthorizationStatus在设置中授权后被拒绝_Ios_Swift_Contacts - Fatal编程技术网

Ios ABAddressBookGetAuthorizationStatus在设置中授权后被拒绝

Ios ABAddressBookGetAuthorizationStatus在设置中授权后被拒绝,ios,swift,contacts,Ios,Swift,Contacts,我试图更优雅地处理被拒绝的联系人簿权限,但我发现一个场景无法正常工作。我正在运行Xcode 7和Swift 2.0 首先,我解释了为什么权限与应用程序体验相关,然后当他们决定应该允许时,他们可以点击按钮进行通话: ABAddressBookRequestAccessWithCompletion(nil) { (granted:Bool, err:CFError!) in if(granted){ // Get contacts } } 如果他们拒绝iOS

我试图更优雅地处理被拒绝的联系人簿权限,但我发现一个场景无法正常工作。我正在运行Xcode 7和Swift 2.0

首先,我解释了为什么权限与应用程序体验相关,然后当他们决定应该允许时,他们可以点击按钮进行通话:

ABAddressBookRequestAccessWithCompletion(nil) {
    (granted:Bool, err:CFError!) in
    if(granted){
        // Get contacts
    }
}
如果他们拒绝iOS权限对话框,我会在检查
ABAddressBookGetAuthorizationStatus()
后使用以下代码提示他们:

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

为了以防万一,我向苹果公司提交了一个bug,但我想知道是否还有其他人有办法让它正常工作


谢谢

尽管我一再请求,但您没有提供足够的关于代码是什么以及如何测试的信息,所以现在我只能猜测。我猜你的测试程序有缺陷。在Xcode调试器中运行时无法测试此功能。如果您解除设备的设置并仅在设备上进行测试,您会发现,当您从“设置”返回应用程序时,如果您的应用程序再次检查授权状态,则授权状态正确。

您是否意识到整个API在iOS 9中已被弃用,是吗?我的意思是,我们可以详细讨论这件事,但如果像你应该做的那样,你放弃整件事,进入现代的接触世界,那就不值得了。但是,如果您真的想进一步研究这个问题,那么请显示您的实际代码。显示您是如何测试授权状态的。@matt当然大多数应用程序仍然支持iOS 8,并且必须使用旧的API。@matt是的,我知道关于新联系人框架的所有信息,但我现在想支持iOS 8,并且不希望包含“如果支持”块好的,好的。好的,这在我的代码中是有效的(例如:),所以正如我已经说过的,如果您需要更多帮助,请显示更多详细信息。@matt感谢您提供的示例。我将更新我的问题,但我使用的方法与您在示例中使用的方法完全相同。我想知道这个问题是否是iOS 9新引入的。
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
    }
}