👻

[iOS] PHPickerViewControllerの不思議な挙動

に公開

次のように、一度取得したassetIdentifierpreselectedAssetIdentifiersに指定してPHPickerViewControllerを表示する実装があります。

func presentPicker() {
        var configuration = PHPickerConfiguration(photoLibrary: .shared())
        configuration.preselectedAssetIdentifiers = [id]
        let vc = PHPickerViewController(configuration: configuration)
        vc.delegate = self
        present(vc, animated: true)
}

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
	dismiss(animated: true)
	id = results[0].assetIdentifier!
	print(results[0].itemProvider)
}

これを実行すると、次のようなItemProviderを得ることができます。

<PUPhotosFileProviderItemProvider: 0x600003005290> {types = (
    "public.jpeg",
    "com.apple.private.photos.thumbnail.standard",
    "com.apple.private.photos.thumbnail.low"
)}

しかし、preselectedAssetIdentifiersが指定された2回目の実行時は次のようにtypesが空になった状態のItemProviderが得られます。

<PUPhotosFileProviderItemProvider: 0x600003019200> {types = (
)}

preselectedAssetIdentifiersを指定する場合は、前回取得したItemProviderをキャッシュして使い回す必要がありそうです。
なお、preselectedAssetIdentifiersを指定していない場合は、2回目以降もitemProviderが取得できます。

https://developer.apple.com/documentation/photokit/phpickerconfiguration/3752109-preselectedassetidentifiers

Results don’t include item providers for preselected assets that remain selected.

Discussion