オリジナル情報源
このページは、次の情報を日本語に翻訳したものです。お役に立てば幸いです。
Requesting Authorization for Media Capture on iOS
iOS 13.0以降
Xcode 11.1以降
AVFoundation
概要
iOSでは、ユーザーは各アプリがカメラとマイクにアクセスすることを明示的に許可する必要があります。アプリが初めてキャプチャシステムを使用できるようになる前に、iOSは、以下に示すように、アプリにカメラへのアクセスを許可するようユーザーに要求するアラートを表示します。iOSはこのアラートに対するユーザーの応答を記憶しているため、その後キャプチャシステムを使用しても、アラートが再び表示されることはありません。ユーザーは、[設定]> [プライバシー]でアプリの権限設定を変更できます。
メディアをキャプチャする前にアプリに権限があることを確認するには、以下の手順に従います。
アプリのinfo.plistファイルを構成する
iOSでは、システムがカメラまたはマイクの許可を要求したときにユーザーに表示する静的メッセージをアプリが提供する必要があります。
- アプリがデバイスカメラを使用している場合は、アプリのInfo.plistファイルにNSCameraUsageDescriptionキーを含めます。
- アプリがデバイスマイクを使用する場合は、アプリのInfo.plistファイルにNSMicrophoneUsageDescriptionキーを含めます。
キーごとに、アプリがメディアをキャプチャする必要がある理由をユーザーに説明するメッセージを提供します。これにより、ユーザーはアプリに許可を与えることに自信を持つことができます。
重要
アプリが承認を要求したとき、またはキャプチャデバイスを使用しようとしたときに、適切なキーがアプリのInfo.plistファイルに存在しない場合、システムはアプリを終了します。
キャプチャの承認を確認してリクエストする
キャプチャセッションを設定する前に、必ずAVCaptureDevice
authorizationStatus(for:)
メソッドをテストしてください。ユーザーがキャプチャ権限をまだ付与または拒否していない場合、承認ステータスはAVAuthorizationStatus.notDetermined
です。この場合、requestAccess(for:completionHandler:)
メソッドを使用して、ユーザーにプロンプトを表示するようにiOSに指示します。
switch AVCaptureDevice.authorizationStatus(for: .video) { case .authorized: // The user has previously granted access to the camera. self.setupCaptureSession() case .notDetermined: // The user has not yet been asked for camera access. AVCaptureDevice.requestAccess(for: .video) { granted in if granted { self.setupCaptureSession() } } case .denied: // The user has previously denied access. return case .restricted: // The user can't grant access due to restrictions. return }
requestAccess(for:completionHandler:)
メソッドは非同期です:あなたのアプリは、iOSが許可警告を示しながら実行し続けます。ユーザーが応答すると、システムは完了ハンドラーを呼び出します。完了ハンドラの成功パラメータがtrueの場合、キャプチャセッションのセットアップと開始に進むことができます。
注意
キャプチャを開始する前に requestAccess(for:completionHandler:)
を呼び出しますが、アプリに適した時間にのみ行ってください。たとえば、写真やビデオの録画がアプリの主な焦点ではない場合は、ユーザーがアプリのカメラ関連機能を呼び出したときにのみカメラの権限を確認します。
キャプチャしたメディアを保存する前に承認を要求する
写真またはビデオをキャプチャした後、それらをユーザーのフォトライブラリに保存することができます。フォトライブラリにアクセスするには、ユーザーの権限も必要です(カメラとマイクの権限とは別に)。いつどのように許可を要求するかは、メディアの保存に使用する機能によって異なります。
- ほとんどの写真およびビデオキャプチャワークフロー(Live PhotosやRAW形式のキャプチャを含む)では、
PHPhotoLibrary
およびPHAssetCreationRequest
クラスを使用します。これらのクラスにはPhotosライブラリへの読み取り/書き込みアクセス権が必要なため、Info.plistのNSPhotoLibraryUsageDescriptionキーを使用して、アクセスを要求するときにユーザーにメッセージを提供する必要があります。詳細については、キャプチャした写真の保存を参照してください。 - アプリがムービーファイルをPhotosライブラリに保存するだけでよい場合、この
UISaveVideoAtPathToSavedPhotosAlbum(_:_:_:_:)
関数はPHPhotoLibraryより簡単な方法を提供します。この関数はライブラリへの書き込みアクセスのみを必要とするため、Info.plistのNSPhotoLibraryAddUsageDescriptionキーを使用して、フォトライブラリへの保存の許可を求めるときにユーザーにメッセージを提供します。
注意
UIImage
クラスは写真出力に含まれる機能とメタデータをサポートしていないため、このUIImageWriteToSavedPhotosAlbum(_:_:_:_:)
関数をAVCapturePhotoOutput
でキャプチャした写真で使用することはお勧めしません。