iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
0
自我挑戰組

一天一蘋果,Bug 遠離我。系列 第 22

Day 22: 再次向使用者請求開啟功能的權限。

當我們使用者再次進入需要權限的畫面,就在發出一次請求吧!

https://ithelp.ithome.com.tw/upload/images/20181106/20107701v6SPQyqKnd.jpg

前言:

沒有允許開啟相機權限掃 QR Code 時的畫面我們經常在開發 App 碰到需要要求使用者允許使用權限才能實作的功能,例如:地圖定位、相機應用或是推播通知,如果使用者沒有授權給我們,那麼他將無法使用這些需要授權的應用。那假如使用者第一次無意間按到不允許開放權限,又或是之後想要開啟需要權限的功能,那麼這時當使用者再次進入畫面時,我們就該再次詢問他是否要開啟功能。


#權限判斷

首先我們需要判斷使用者是否允許該功能的權限,這邊我要判斷使用者的在開啟掃描 QR Code 的畫面時,是否允許相機權限,所以在這邊我們會透過 authorizationStatus(for:) 這個方法的回傳的 AVAuthorizationStatus 來判斷,一共有以下四種的回傳值。

#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 沒有允許時,那麼進入條碼掃描的頁會出現:

https://ithelp.ithome.com.tw/upload/images/20181106/20107701G3qGahLYOp.png

這時候我們按下設定就會跳到關於這個 App 的設定,就可以設定關於這個 App 的權限或是其他設定:

https://ithelp.ithome.com.tw/upload/images/20181106/20107701DWD3lWWc2r.png


後記:

透過這次教學後,我們就能夠去避免使用者第一次誤觸權限按鈕,按到不允許的狀況,如此一來我們就能夠很彈性的讓使用者自己開啟或關閉訪問的權限,當然我們這個 App 中的定位功能也能透過類似的方式實作,只是在這個 App 中我們不太需要用到,那麼我們這次的教學就到這邊結束了,下次再見~


上一篇
Day 21: 使用原生的地圖導航吧!
下一篇
Day 23: 第二輪挑戰賽,做一個 Soda Shake!
系列文
一天一蘋果,Bug 遠離我。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言