如何从PHAsset获取ALAsset URL?

Cla*_*ges 18 alasset alassetslibrary ios8 photokit phasset

你可以偷偷地使用未记录的 PHAsset.ALAssetURL财产† ,但我正在寻找记录的东西.


†在Objective-C中,这将有所帮助

@interface PHAsset (Sneaky)

@property (nonatomic, readonly) NSURL *ALAssetURL;

@end
Run Code Online (Sandbox Code Playgroud)

hol*_*ann 44

通过利用的localidentifier创建assetURL PHAsset.示例: PHAsset.localidentifierreturn91B1C271-C617-49CE-A074-E391BA7F843F/L0/001

现在使用32个第一个字符来构建assetURL,如:

assets-library://asset/asset.JPG?id=91B1C271-C617-49CE-A074-E391BA7F843F&ext=JPG

您可以JPG根据资产的UTI 更改扩展名(requestImageDataForAsset返回UTI),但在我的测试中,无论如何都会忽略assetURL的扩展名.

  • 我们必须这样做只是为了得到一个URL是荒谬的. (36认同)
  • 从localIdentifier获取GUID的正确方法是拆分第一个/.(有些GUID超过32个字符.)如果有人知道获取资产URL的更好方法,请在此处发布.这很黑,很容易打破未来的更新. (5认同)
  • 不要使用这种方法。这是黑客和未记录的,Apple 可能会随时更改组合资产 URL 的规则。此外,您无法处理一些边缘情况,例如未下载的资源。我之前尝试过,然后一些用户报告说他们看不到他们相册中的某些图像。我在我的崩溃报告中看到很多错误报告说 AssetsLibrary can't find image at URL: assets-library://xxx, 我花了很多时间才弄明白。更好的方法是将 PHAsset 提取到本地文件系统并重构您的代码以使用文件系统 URL,或者只是迁移到 PHAsset。 (3认同)
  • 确保从localIdentifier中删除"/ L0/001",否则每次都会失败. (2认同)

Mat*_*att 8

我希望能够获得资产的URL.但是,我已经意识到localIdentifier可以坚持而不是用来恢复PHAsset.

PHAsset* asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil].firstObject;
Run Code Online (Sandbox Code Playgroud)

可以使用以下方式转换旧版资产网址:

PHAsset* legacyAsset = [PHAsset fetchAssetsWithALAssetUrls:@[assetUrl] options:nil].firstObject;
NSString* convertedIdentifier = legacyAsset.localIdentifier;
Run Code Online (Sandbox Code Playgroud)

(在那种方法被淘汰之前......)

(感谢霍尔特曼 - localIdentifier隐藏在其中PHObject.)

  • 你说的是什么_may_是真的,但它似乎只与实际(我认为,明确陈述)的问题倾斜相关. (2认同)
  • 我发现创建一个单独的自我回答问题是一种更好的格式,适用于您所做的任何此类实现.我已经做了很多,尽管他们告诉你,他们还没有失明.:)你甚至可以链接到这个问题. (2认同)