【问题标题】:How to get a ALAssetRepresentation of a shared photostream ALAsset?如何获取共享照片流 ALAsset 的 ALAssetRepresentation?
【发布时间】:2013-08-07 10:27:45
【问题描述】:

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

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

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

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

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

如何使资产在本地可用?

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

【问题讨论】:

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

标签: ios objective-c alasset photostream


【解决方案1】:

由于 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 */  }];

【讨论】:

    【解决方案2】:

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

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

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

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

    ALAsset+RequestDefaultRepresentation.h

    #import <AssetsLibrary/AssetsLibrary.h>
    
    @interface ALAsset (RequestDefaultRepresentation)
    - (void)requestDefaultRepresentation;
    @end
    

    【讨论】:

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

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

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2012-03-12
      相关资源
      最近更新 更多