我正在使用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
答案 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')
请记住,这会返回一系列结果。