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

18

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

根据文档,在资产(asset)尚未在本地可用的情况下,这可能会发生。

对于共享照片流中尚未可用的资产,此方法将返回nil。如果该资产将来变得可用,则会发布ALAssetsLibraryChangedNotification通知。

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

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

如何使资产在本地可用?

编辑:由于苹果在iOS8中引入了Photos.framework,并且在iOS9中已经停用了ALAssets,因此这可能永远不会被修复。


1
也遇到了这个问题,在iOS7上更频繁地看到。其他应用程序似乎有一种加载这些图像的方法,因此必须有一种方法,但是阅读与ALAsset相关的文档并没有揭示任何信息... - Laura
@Laura 我在iOS7上也看到了这个问题,虽然我没有看到其他应用程序正确处理相同的照片。如果我的应用程序无法加载此类图像,则会切换到Instagram,在尝试访问相同的照片时它会崩溃。一旦我在苹果的照片应用程序中打开了该照片,它就可以在任何地方正常工作。 - Pieter
Pic Collage是我运行的应用程序,它似乎工作正常(至少有时候 - 其他时候它会崩溃)。当我从照片选择器中选择缩略图时,我可以看到它首先将照片添加为模糊的、方形的缩略图版本,然后一两秒钟后,它用完整尺寸的图像替换了缩略图。所以,它似乎去加载它,但现在不确定了。我尝试创建一个新相册,将资产添加到该相册,然后尝试枚举该组中的资产,但也没有成功。 - Laura
我也遇到了这个问题。不幸的是,在文档中我没有找到任何相关的内容。 - Dev
有人找到解决方案了吗? - Mark
据我所知,@Mark没有。 - Pieter
3个回答

4
我遇到了同样的问题。我找不到一种方法来获取图片。 你所能做的就是不显示那些“defaultRepresentation”为空的图片,或者通过调用[ALAssetsLibrary disableSharedPhotoStreamsSupport];来完全放弃对共享照片的支持。
希望这能帮到你。

2
我找到了答案!这个方法没有官方文档,因此请小心使用以下答案。(小心意味着,苹果不允许使用私有API调用)。
在资产(Asset)上有一个名为- (void)requestDefaultRepresentation;的方法,您可以使用此方法触发资产库下载共享照片。如文档所述,ALAssetsLibraryChangedNotification将被触发,以让您知道图像已经可用。
不知道为什么苹果没有记录它。祝你好运并玩得开心=)
您可以通过以下标题避免警告: ALAsset+RequestDefaultRepresentation.h
#import <AssetsLibrary/AssetsLibrary.h>

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

了解这点很好,但使用私有 API 显然不是 App Store 上应用程序的可接受解决方案。 - Pieter
1
我明白了,至少这让人清楚它的存在以及可能的实现方式。没有其他办法。 - Mark

1
自从苹果在iOS8中引入了PhotoKit框架,并且在iOS9中所有ALAsset内容都已过时,可以说这将永远不会得到修复。
然而,使用新的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 */  }];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接