2015-09-27 94 views
2

我试图更优雅地处理拒绝的联系簿权限,但我发现一个无法正常工作的情况。我正在运行Xcode 7和Swift 2.0。ABAddressBookGetAuthorizationStatus授权设置后拒绝

首先我解释为什么许可是相关的应用体验,然后当他们决定它应该被允许,他们可以点击与呼叫按钮:

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中授权设置页面。

我提出了一个苹果公司的错误以防万一,但我想知道是否有其他人有一个技巧,让这个工作。

谢谢!

+1

你确实意识到这整个API在iOS 9中已被弃用,是吗?我的意思是,我们可以详细讨论这个问题,但如果像你所想的那样,你只是放弃整个事物并进入现代社会世界,那将是不值得的。但是,如果您真的想进一步探究,请显示您的实际代码。显示您如何测试授权状态。 – matt

+0

@matt当然,大多数应用程序仍然支持iOS 8,并且必须使用旧的API。 – rmaddy

+0

@matt是的,我知道所有关于新的联系框架,但我想现在支持iOS 8,宁可不包括“如果支持”块 – a432511

回答

0

尽管我一再要求,但您还没有提供足够的有关您的代码和测试方式的信息,因此在这一点上我只能猜测。我的猜测是你的测试程序有缺陷。在Xcode调试器中运行时无法测试此功能。如果您打开设备并纯粹在设备上进行测试,您会发现,当您从设置返回到应用程序时,如果您的应用程序再次检查授权状态,它将获得授权状态。