
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>