UIImagePickerController.isSourceTypeAvailable(.camera) で実装しろと本に書いてあったが、これだけじゃいけないらしい。アクセス権についての許諾も必要らしく、調べ物をまとめておく

UIImagePickerController.isSourceTypeAvailable(.camera) の意味って?

カメラが搭載されていて、カメラが利用可能かどうか?を見るものらしい。

ようするに、デバイスとして存在し、生きてるかどうか?を見るものらしく、それを使っていいかどうか?という権限は別の話らしい。

だったら、権限の許諾だけ見たらいいのでは?カメラがあるから権限があるんだよね?って話になりそうだが、あくまで権限は権限があるかどうか?の設定の問題であり、デバイスとしてカメラがあるかどうか?は別の話らしい。

なので

1.カメラがあって、生きてるかどうか?
2.カメラの利用権限があるかどうか?

と2段階でチェックが必要らしい。

AVCaptureDevice.authorizationStatus(for: .video)の意味って?

これがカメラへのアクセス権限の確認になる。

なので、

1.UIImagePickerController.isSourceTypeAvailable(.camera)  がtrueか確認

2.AVCaptureDevice.authorizationStatus(for: .video) で権限取れてるか?を確認。
  確認すらしてなかったら、確認を取る

3.ちなみに、確認を取る時はポップアップが出て、文言は『“アプリ名”がカメラへのアクセスを求めています』
 これは、文言修正はできない、システム側の固定文言

実際の実装サンプル

///カメラが実装されており、使える状態か?を確認する
if UIImagePickerController.isSourceTypeAvailable(.camera) {
    
    // アクセス権限の状態を取得する
    let cameraStatus = AVCaptureDevice.authorizationStatus(for: .video)
//状態によってswitchで分岐
    switch cameraStatus {
    case .authorized:
        // カメラのアクセスが許可されている
        print("カメラが利用可能です")
    case .notDetermined:
        // 許可がまだ決まっていない場合、リクエストを送る
        AVCaptureDevice.requestAccess(for: .video) { granted in
            if granted {
                print("カメラのアクセスが許可されました")
            } else {
                print("カメラのアクセスが拒否されました")
            }
        }
    case .denied, .restricted:
        // カメラのアクセスが拒否・制限されている
        print("カメラのアクセスが許可されていません")
    @unknown default:
        break
    }
} else {
    // カメラが存在しない、または利用不可
    print("カメラが利用できません")
}

ちなみに、アクセスを求める文言は修正できないが、その下の説明文みたいなところは追記できる。


Info.plistに追記

<key>NSCameraUsageDescription</key>
<string>写真を撮影するためにカメラへのアクセスが必要です。</string>

コメント