見出し画像

Macでのメディアキャプチャの承認要求

以下の記事を参考に書いてます。

Requesting Authorization for Media Capture on macOS

1. Macでのメディアキャプチャの承認要求

「macOS 10.14以降」では、ユーザーは各アプリが「カメラ」と「マイク」にアクセスすることを明示的に許可する必要があります。

アプリが初めてキャプチャシステムを使用する前に、macOSは以下に示すように、ユーザーにアプリにアクセスを許可するように求める「権限アラート」を表示します。macOSはこのアラートに対するユーザーの応答を記憶しているため、キャプチャシステムを後で使用しても、アラートが再度表示されることはありません。

ユーザーは、「システム環境設定 → セキュリティとプライバシー」でアプリの権限設定を変更できます。承認要求は、iOSのアラートUIとは異なります。

画像1

メディアをキャプチャする前にアプリに権限があることを確認するには、以下の手順に従います。

1. カメラとマイクの設定

macOSの「カメラ」と「マイク」の「情報プロパティリストキー」は、iOSの場合と同じように動作します。「macOS 10.14以降」では、システムが「カメラ」または「マイク」の許可を要求すると、静的メッセージに次の文字列が入力されます。

・アプリが「カメラ」を使用する場合は、アプリのInfo.plistに NSCameraUsageDescriptionキー を含めます。
・アプリが「マイク」を使用する場合は、アプリのInfo.plistに NSMicrophoneUsageDescriptionキー を含めます。

キーごとに、アプリがメディアキャプチャする必要がある理由をユーザーに説明するメッセージを提供します。これにより、ユーザーはアプリに許可を与えることに自信を持つことができます。

画像2

【重要】
アプリが承認をリクエストしたとき、またはキャプチャデバイスを使用しようとした時、アプリの「Info.plist」に適切なキーが存在しない場合、システムはアプリを終了します。Xcodeデバッグコンソールに、クラッシュの理由を説明するメッセージが表示されます。

2. キャプチャの承認を確認して要求

キャプチャセッションを設定する前に、必ず AVCaptureDevice authorizationStatus(for:) をテストしてください。ユーザーがキャプチャ権限をまだ付与または拒否していない場合、承認ステータスは AVAuthorizationStatus.notDetermined です。この場合、requestAccess(for:completionHandler:) を使用して、macOSでユーザーに権限アラートを表示させます。

switch AVCaptureDevice.authorizationStatus(for: .video) {
    case .authorized: // ユーザーは以前にカメラへのアクセスを許可している
        self.setupCaptureSession()

    case .notDetermined: // ユーザーはまだカメラへのアクセスを要求されていない
        AVCaptureDevice.requestAccess(for: .video) { granted in
            if granted {
                self.setupCaptureSession()
            }
        }

    case .denied: // ユーザーが以前にアクセスを拒否した
        return

    case .restricted: // 制限によりユーザーはアクセスを許可できない
        return
}

requestAccess(for:completionHandler:) は非同期です。macOSが権限アラートを表示している間も、アプリは実行を続けます。ユーザーが応答すると、システムは完了ハンドラを呼び出します。完了ハンドラの成功パラメータがtrueの場合、キャプチャセッションのセットアップと開始に進むことができます。

【注意】
キャプチャを開始する前に requestAccess(for:completionHandler:) を呼び出しますが、これはアプリに適したタイミングでのみ行います。たとえば、写真やビデオの録画がアプリの主な焦点ではない場合は、ユーザーがアプリのカメラ関連機能を呼び出した時のみ、カメラの権限を確認します。

3. キャプチャしたメディアを保存する前の承認要求

写真またはビデオをキャプチャした後、それらをユーザーのフォトライブラリに保存することができます。フォトライブラリにアクセスするにも、ユーザーの権限が必要です。ほとんどの写真およびビデオキャプチャワークフロー(Live PhotosやRAW形式のキャプチャを含む)では、PHPhotoLibraryクラス PHAssetCreationRequestクラス を使用します。

これらのクラスにはPhotosライブラリへの読み書き権限が必要なため、「情報プロパティリスト」の NSPhotoLibraryUsageDescriptionキー を使用して、アクセスを要求する時に、ユーザーにメッセージを提供する必要があります。詳細については、「キャプチャした写真の保存」を参照してください。

4. ターミナルでの承認のリセット

「マイク」と「カメラ」へのアクセス許可設定をリセットして、ダイアログを再度表示するには、ターミナルで以下のコマンドを入力します。

$ tccutil reset Microphone
$ tccutil reset Camera

このコマンドはすべてのアプリのアクセス許可設定をリセットするため、他のアプリも権限アラートが再度表示されます。このツールを使用して、権限アラートに表示するメッセージをデバッグできます。

【ヒント】
tccutilを使用して、AddressBook、Calendar、Finderなどの他のシステムサービスの認証アクセス設定をリセットすることもできます。

この記事が気に入ったらサポートをしてみませんか?