オリジナル情報源
概要
AVCapturePhotoOutput
で写真のキャプチャを完了すると、静止画像データだけでなく、カメラのメタデータとキャプチャでリクエストした補助画像(サムネイルや深度マップなど)を含むAVCapturePhoto
オブジェクトを受け取ります。これらのタイプのデータをAVCapturePhotoから個別に取得するか、そのfileDataRepresentation()
メソッドを呼び出して、AVCapturePhotoSettings
でその写真に要求したコーデックとファイル形式を使用して、Data
オブジェクトをディスクに書き込む準備をすることができます。
通常、写真をキャプチャした後、そのデータをユーザーのフォトライブラリに追加します。Photos
フレームワークを使用してそうすることができます。
フォトライブラリの使用許可をリクエストする
iOSがカメラとマイクへのアクセスをユーザーに許可することでユーザーのプライバシーを保護するのと同じように、システムはユーザーにアプリにフォトライブラリへのアクセスを許可することも要求します。アプリの許可を取得するには:
- アプリケーションのInfo.plistファイル内のNSPhotoLibraryUsageDescription キーを含むように構成します。このキーの値は、フォトライブラリへのアクセスを要求するシステムアラートでユーザーに表示されるメッセージです。このメッセージを使用して、アプリにそのようなアクセスが必要な理由をユーザーに説明します。
- 承認を確認またはリクエストします。この
PHPhotoLibrary
requestAuthorization(_:)
メソッドを使用して、ユーザーが最初にアプリのカメラ機能を開いたときなど、アプリに適切なタイミングでiOSにフォトライブラリへのアクセスを求めるアラートが表示されるようにします。(ユーザーが最初の写真を撮るまで待たないでください。許可の警告により、複数の写真を撮ることができなくなります。)
以下のコードは、アクセスを確認するための簡単なワークフローを示しています。
PHPhotoLibrary.requestAuthorization { status in guard status == .authorized else { return } // Use PHPhotoLibrary.shared().performChanges(...) to add assets. }
作成リクエストを使用して写真アセットを追加する
このAVCapturePhoto
fileDataRepresentation()
メソッドは、写真キャプチャからのすべての画像データ、補助画像データ、およびメタデータを、ディスクに書き込む準備ができている単一のデータオブジェクトにパッケージ化します。そのデータを写真ライブラリに追加するには、PHPhotoLibrary
およびPHAssetCreationRequest
クラスを使用します。
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { guard error == nil else { print("Error capturing photo: \(error!)"); return } PHPhotoLibrary.requestAuthorization { status in guard status == .authorized else { return } PHPhotoLibrary.shared().performChanges({ // Add the captured photo's file data as the main resource for the Photos asset. let creationRequest = PHAssetCreationRequest.forAsset() creationRequest.addResource(with: .photo, data: photo.fileDataRepresentation()!, options: nil) }, completionHandler: self.handlePhotoLibraryError) } }
注意
performChanges(_:completionHandler:)
ブロックは、1つのアトミックアップデートではフォトライブラリに複数の変更を行うことができます。たとえば、新しく作成したアセットをアルバムに追加できます。または、ブラケットキャプチャを実行すると、複数のdidFinishProcessingPhoto結果を蓄積して、それらを一緒にフォトライブラリに保存できます。詳細については、Photosドキュメントを参照してください。