9

我正在使用 aUIImagePickerController让用户选择要在应用程序中共享的照片或视频。当用户在他们的库中选择一个媒体项目时,我在其中一个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

我发现以下问题似乎可以通过有效的解决方案得到答案:ALAssetsLibraryassetForURL:在 iOS 8.1 中的“我的照片流”中始终为照片返回 nil

但是上面的链接使用了AssetsLibrary苹果不再推荐的框架:

“在 iOS 8.0 及更高版本中,使用 Photos 框架而不是 Assets Library 框架。Photos 框架为使用用户的照片库提供了更多功能和更好的性能。请参阅 Photos Framework Reference。”

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

didFinishPickingMediaWithInfo:以下是在委托方法的信息字典中返回的参考 URL 示例:

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

2 回答 2

1

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

于 2015-02-13T12:27:03.777 回答
1

这令人难以置信,但从 iOS 10.3.3 开始,该错误仍然存​​在,并且看起来它仅由 iOS 11 修复...

为了涵盖 iOS 10 及以下版本,我使用fetchAssetsPHAssetdidFinishPickingMediaWithInfo委托方法返回的信息字典:

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

请记住,这会返回一个结果数组。

于 2017-10-23T14:47:27.600 回答