从fetchAssetsWithALAssetURLs返回的PHAsset:从"我的照片流"中选择照片时总是为零。专辑使用UIImagePickerController

时间:2014-12-16 03:07:13

标签: ios8 uiimagepickercontroller alassetslibrary phasset photosframework

我正在使用UIImagePickerController让用户选择要在应用中分享的照片或视频。当用户在其库中选择媒体项时,我使用UIImagePickerController's委托方法之一执行此代码:

- (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"中选择一个项目时,返回的PHAsset始终为nil

我发现以下问题似乎对工作解决方案有了答案:ALAssetsLibrary assetForURL: always returning nil for photos in "My Photo Stream" in iOS 8.1

但上述链接使用了Apple不再推荐的AssetsLibrary框架:

  

"在iOS 8.0及更高版本中,使用Photos框架而不是Assets   图书馆框架。 Photos框架提供了更多功能和   使用用户照片库的性能更佳。见照片   框架参考。"

我需要能够为PHAsset相册中的媒体项目返回"My Photo Stream"个对象。现在,UIImagePickerController字典中info返回的参考URL是在控制台中登录的有效URL,但在使用此URL时,是有效的PHAsset对象永远不会回来。

以下是didFinishPickingMediaWithInfo:委托方法的信息词典中返回的参考网址示例:

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

2 个答案:

答案 0 :(得分:1)

这是一个错误,似乎在最新的iOS 8.2x测试版中得到修复。

答案 1 :(得分:1)

令人难以置信但是从iOS 10.3.3开始,这个bug仍然存在,看起来它只是由iOS 11修复了......

为了覆盖iOS 10及以下版本,我使用fetchAssets PHAsset didFinishPickingMediaWithInfo来自PHAsset.fetchAssets(withALAssetURLs: [info["UIImagePickerControllerReferenceURL"] as! URL], options: nil) 委托方法返回的信息词典:

raise KeyError('This is a \n Line break')

请记住,这会返回一系列结果。