當我們使用者再次進入需要權限的畫面,就在發出一次請求吧!
沒有允許開啟相機權限掃 QR Code 時的畫面我們經常在開發 App 碰到需要要求使用者允許使用權限才能實作的功能,例如:地圖定位、相機應用或是推播通知,如果使用者沒有授權給我們,那麼他將無法使用這些需要授權的應用。那假如使用者第一次無意間按到不允許開放權限,又或是之後想要開啟需要權限的功能,那麼這時當使用者再次進入畫面時,我們就該再次詢問他是否要開啟功能。
首先我們需要判斷使用者是否允許該功能的權限,這邊我要判斷使用者的在開啟掃描 QR Code 的畫面時,是否允許相機權限,所以在這邊我們會透過 authorizationStatus(for:)
這個方法的回傳的 AVAuthorizationStatus
來判斷,一共有以下四種的回傳值。
.notDetermind
:媒體捕獲需要明確的使用者權限,但用戶尚未允許或拒絕此權限。.restricted
:使用者不允許訪問媒體捕獲設備。.denied
:使用者明確的拒絕媒體捕獲的權限。.authorized
:使用者明確的允許媒體捕獲權限,或者對於相關媒體類型不需要明確的使用者權限。當使用是者允許相機訪問權限時,那麼 AVAuthorizationStatus 就等於 .authorized
,所以我們現在需要對 .authorized
以外的情況去執行請求訪問相機的權限,所以我們會用 requestAccess(for:completionHandler:)
方法來訪問使用者,所以我們整體的程式碼如下:
if AVCaptureDevice.authorizationStatus(for: .video) == .authorized {
// 如果一開始就允許使用相機權限,那麼就建置 QR code 掃瞄器
configurationScanner()
} else {
AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
// 如果一開始不允許使用相機權限,那麼就會再次向使用者要求權限
// 如果允許則建置 QR code 掃瞄器
if granted {
self.configurationScanner()
} else {
// 若是沒有允許使用相機權限,則跳出一個 Alert
// 點選取消,那麼就 dismiss 回首頁
let alertController = UIAlertController(title: "開啟失敗", message: "請先開啟相機權限", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: { _ in
self.dismiss(animated: true, completion: nil)
})
// 若點選設定,那麼則會跳到此 App 的設定畫面,可以對 App 開啟權限的設定
let okAction = UIAlertAction(title: "設定", style: .default, handler: { _ in
let url = URL(string: UIApplication.openSettingsURLString)
if let url = url, UIApplication.shared.canOpenURL(url) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
})
} else {
UIApplication.shared.openURL(url)
}
}
})
alertController.addAction(cancelAction)
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
}
})
}
所以當我們第一次開啟 App 沒有允許時,那麼進入條碼掃描的頁會出現:
這時候我們按下設定就會跳到關於這個 App 的設定,就可以設定關於這個 App 的權限或是其他設定:
透過這次教學後,我們就能夠去避免使用者第一次誤觸權限按鈕,按到不允許的狀況,如此一來我們就能夠很彈性的讓使用者自己開啟或關閉訪問的權限,當然我們這個 App 中的定位功能也能透過類似的方式實作,只是在這個 App 中我們不太需要用到,那麼我們這次的教學就到這邊結束了,下次再見~