如何获取共享照片流 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?的主要内容,如果未能解决你的问题,请参考以下文章