2015-09-27 135 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調試器中運行時無法測試此功能。如果您打開設備並純粹在設備上進行測試,您會發現,當您從設置返回到應用程序時,如果您的應用程序再次檢查授權狀態,它將獲得授權狀態。