如何获取共享照片流 ALAsset 的 ALAssetRepresentation?

Posted

技术标签:

【中文标题】如何获取共享照片流 ALAsset 的 ALAssetRepresentation?【英文标题】:How to get a ALAssetRepresentation of a shared photostream ALAsset? 【发布时间】:2013-08-06 12:09:21 【问题描述】:

当我尝试从照片流中访问图片时,[asset defaultRepresentation] 方法有时会返回 nil。

根据文档,如果资产(尚未)在本地可用,则可能会发生这种情况。

对于共享照片流中尚不可用的资产,此方法返回 nil 本地。如果资产在未来可用,则 ALAssetsLibraryChangedNotification 通知已发布。

一旦我在 Photos.app 中查看照片,它也可用于我的应用程序,但显然我希望我的应用程序触发“本地下载”事件。

我查看了来自 Apple 的 MyImagePicker 示例代码,但它表现出相同的行为(只有缩略图可用)

如何使资产在本地可用?

编辑:由于 Apple 在 ios8 中引入了Photos.framework,并且在 iOS9 中不推荐使用 ALAssets,这可能永远不会得到解决。

【问题讨论】:

也遇到了这个问题,看到它在iOS7上运行的频率更高。其他应用似乎有办法加载这些图片,所以一定有办法,但是阅读 ALAsset 相关的文档并没有发现什么…… @Laura 我在 iOS7 上也看到了这个,但我不能说我见过其他应用程序正确处理相同的照片。 (如果这样的图像没有加载到我的应用程序中,我会切换到 instagram,并在尝试访问同一张照片时崩溃)。在 Apple 的照片应用中打开照片后,它在任何地方都能正常工作。 Pic Collage 是我运行的应用程序,它似乎可以工作(至少有时 - 其他时候它只是崩溃)。当我从照片选择器中选择缩略图时,我可以看到它首先将照片添加为缩略图的模糊方形版本,然后大约一秒钟后,它将缩略图替换为全尺寸图像。所以,它似乎会关闭并加载它,但现在不确定。我尝试创建一个新专辑,将资产添加到该专辑,然后尝试枚举该组中的资产,但也没有骰子。 我也遇到了这个问题。不幸的是,在文档中我没有找到任何相关内容。 有人找到解决方案了吗? 【参考方案1】:

我也遇到了同样的问题。我找不到实际获取图像的方法。 您所能做的就是不显示具有“defaultRepresentation” nil 的图像,或者通过调用 [ALAssetsLibrary disableSharedPhotoStreamsSupport]; 完全放弃对共享照片的支持

希望有帮助

【讨论】:

【参考方案2】:

我找到了答案!它没有记录,因此请谨慎使用以下答案。 (谨慎我的意思是,Apple 不允许使用私有 API 调用)。

资产上有一个名为- (void)requestDefaultRepresentation;的方法,您可以使用该方法触发资产库下载共享照片。如文档中所述,ALAssetsLibraryChangedNotification 将被触发以通知您图像可用。

不知道,为什么 Apple 没有记录它。祝你好运玩得开心=)

您可以通过以下标头避免警告:

ALAsset+RequestDefaultRepresentation.h

#import <AssetsLibrary/AssetsLibrary.h>

@interface ALAsset (RequestDefaultRepresentation)
- (void)requestDefaultRepresentation;
@end

【讨论】:

很高兴知道,但对于 Appstore 上的应用来说,使用私有 API 显然不是一个可接受的解决方案。 我明白,至少它清楚地表明了它的存在以及它可以完成的方式。没有别的办法。【参考方案3】:

由于 Apple 在 iOS8 中引入了 PhotoKit 框架,并且所有 ALAsset 东西在 iOS9 中都已被弃用,因此可以肯定地说这永远不会得到修复。

但是,这可以通过新的 PhotoKit API 正确完成。

在请求图像时,您必须在PHImageRequestOptions 上设置networkAccessAllowed = YES,如果需要,它将从 iCloud 下载。

 PHAsset* photoAsset = ...
 CGSize fullImageSize = ...
 PHImageRequestOptions* options = [PHImageRequestOptions new];
 options.networkAccessAllowed = YES;
 [[PHImageManager defaultManager] requestImageForAsset:photoAsset
      targetSize:fullImageSize  contentMode:PHImageContentModeAspectFill
      options:options  resultHandler:^(UIImage *result, NSDictionary *info)   /* use result image */  ];

【讨论】:

以上是关于如何获取共享照片流 ALAsset 的 ALAssetRepresentation?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PhotoKit 列出共享的照片流相册

如何将视频从 ALAsset 显示到 UICollectionview ios

如何以编程方式检索对 iOS 照片流中的照片所做的评论?

我如何知道资产库中存在 ALAsset 的 NSURL?

如何使用 ALAsset 获得图像的裁剪版本?

ALAsset 中缺少视频文件缩略图时间戳