【Swift/PhotoKit】PHPickerViewControllerで画像のメタデータ取得する方法!
この記事からわかること
- Swift/PhotoKitのPHPickerViewControllerの使い方
- 画像のメタデータ(撮影日時やロケーションなど)情報を取得する方法
- 取得できるメタデータ情報
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
PHPickerViewController
でアルバムから写真を取得する方法は以下の記事を参考にしてください。
PHPickerViewControllerで画像のメタデータ取得する方法
PHPickerViewController
を使用してアルバムから写真を取得している場合に写真のメタデータ(撮影日時や撮影地など)を取得するにはいくつか注意点がありました。
- info.plistにNSPhotoLibraryUsageDescriptionキーを追加
- PHPickerConfigurationにPHPhotoLibrary.shared()を渡す
- PHPickerResultからメタデータを取得する
info.plistにNSPhotoLibraryUsageDescriptionキーを追加
PHPickerViewController
を使用した方法では不要であったアプリ内からデバイスのカメラロールにアクセスするためのNSPhotoLibraryUsageDescriptionキーを「info.plist」に追加する必要がありました。
「info.plist」を開いたらKeyにNSPhotoLibraryUsageDescription
と入力し、Valueにはカメラロールを使用する旨を記載しておきます。
PHPickerConfigurationにPHPhotoLibrary.shared()を渡す
PHPickerConfiguration
をインスタンス化する際にシングルトンになっているPHPhotoLibrary.shared()
を渡す必要があります。
var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
configuration.filter = .images
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = context.coordinator
PHPickerResultからメタデータを取得する
これで準備ができたのでPHPickerViewControllerDelegate
のpicker(PHPickerViewController, didFinishPicking: [PHPickerResult])
メソッドで受け取ったPHPickerResult
型からassetIdentifier
を取得し、PHAsset.fetchAssets
メソッドをPHAsset
型を取得することで画像のメタデータに参照することができました。
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
parent.presentationMode.wrappedValue.dismiss()
for result in results {
// メタ情報を取得する
if let assetId = result.assetIdentifier {
let assetResults = PHAsset.fetchAssets(withLocalIdentifiers: [assetId], options: nil)
print("撮影日時:\(assetResults.firstObject?.creationDate)")
print("撮影地 :\(assetResults.firstObject?.location?.coordinate)")
}
}
}
取得できるメタデータ情報
PHAsset
型が取得できれば以下のメタデータを取得できるようになります。
class PHAsset : PHObject {
var mediaType: PHAssetMediaType // ビデオやオーディオなどのアセットのタイプ
var mediaSubtypes: PHAssetMediaSubtype // アセットのサブタイプ パノラマ写真や高フレームレートのビデオなど、特別な種類のアセットを識別
var sourceType: PHAssetSourceType // アセットがフォトライブラリに入る手段
var pixelWidth: Int // アセットデータの幅
var pixelHeight: Int // アセットデータの高さ
var creationDate: Date? // アセットの作成日時。
var modifiedDate: Date? // アセットが最後に変更された日時
var location: CLLocation? // アセットの位置情報。
var duration: TimeInterval // 動画アセットの長さ (秒単位)
var isFavorite: Bool // お気に入り
var isHidden: Bool // 非表示
var hasAdjustments: Bool // アセットに調整データが含まれているかどうか
var adjustmentFormatIdentifier: NSString? // 調整フォーマットの識別子
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。