我試圖更優雅地處理拒絕的聯繫簿權限,但我發現一個無法正常工作的情況。我正在運行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