9

UIImagePickerControllerユーザーがアプリで共有する写真やビデオを選択できるようにするためにを使用しています。ユーザーがライブラリ内のメディア アイテムを選択すると、UIImagePickerController'sデリゲート メソッドの 1 つで次のコードを実行します。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

PHAsset *asset;
if ([info[@"UIImagePickerControllerMediaType"] isEqualToString:@"public.movie"]) {
    // Video
    asset = [[PHAsset fetchAssetsWithALAssetURLs:@[info[@"UIImagePickerControllerReferenceURL"]] options:nil] lastObject];

} else if ([info[@"UIImagePickerControllerMediaType"] isEqualToString:@"public.image"]) {
    // Photo
    PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[info[@"UIImagePickerControllerReferenceURL"]] options:nil];
    asset = [[PHAsset fetchAssetsWithALAssetURLs:@[info[@"UIImagePickerControllerReferenceURL"]] options:nil] lastObject];  
   }
}

if statementsというタイトルのアルバムからアイテムを選択する場合を除いて、どちらも写真とビデオの両方で正常に機能します"My Photo Stream"

からアイテムを選択すると、常に"My Photo Stream"が返されます。PHAssetnil

ALAssetsLibrary assetForURL: iOS 8.1 の「マイ フォト ストリーム」の写真に対して常に nil を返す

ただし、上記のリンクでは、 AssetsLibraryApple が推奨しなくなったフレームワークを使用しています。

「iOS 8.0 以降では、Assets Library フレームワークの代わりに Photos フレームワークを使用します。Photos フレームワークは、ユーザーのフォト ライブラリを操作するためにより多くの機能と優れたパフォーマンスを提供します。Photos フレームワーク リファレンスを参照してください。」

アルバムPHAsset内のメディア アイテムのオブジェクトを返せるようにする必要があります。現在、ディクショナリで"My Photo Stream"返される参照 URLは、コンソールにログインする有効な URL ですが、この URL を使用すると、有効なオブジェクトが返されることはありません。UIImagePickerControllerinfoPHAsset

didFinishPickingMediaWithInfo:デリゲート メソッドの情報ディクショナリで返される参照 URL の例を次に示します。

assets-library://asset/asset.JPG?id=DCF5C6E5-B4F4-4E61-9C4B-CC63E104BF2B&ext=JPG
4

2 に答える 2

1

信じられないことですが、iOS 10.3.3 の時点でバグが残っており、iOS 11 でのみ修正されたようです...

iOS 10 以下をカバーするために、デリゲート メソッドから返された情報辞書を使用fetchAssetsしています。PHAssetdidFinishPickingMediaWithInfo

PHAsset.fetchAssets(withALAssetURLs: [info["UIImagePickerControllerReferenceURL"] as! URL], options: nil)

これは結果の配列を返すことに注意してください。

于 2017-10-23T14:47:27.600 に答える