我试图更优雅地处理拒绝的联系簿权限,但我发现一个无法正常工作的情况。我正在运行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中授权设置页面。
我提出了一个苹果公司的错误以防万一,但我想知道是否有其他人有一个技巧,让这个工作。
谢谢!
你确实意识到这整个API在iOS 9中已被弃用,是吗?我的意思是,我们可以详细讨论这个问题,但如果像你所想的那样,你只是放弃整个事物并进入现代社会世界,那将是不值得的。但是,如果您真的想进一步探究,请显示您的实际代码。显示您如何测试授权状态。 – matt
@matt当然,大多数应用程序仍然支持iOS 8,并且必须使用旧的API。 – rmaddy
@matt是的,我知道所有关于新的联系框架,但我想现在支持iOS 8,宁可不包括“如果支持”块 – a432511