PHAsset(或ALAsset)跨设备标识符

Luc*_*cio 5 identifier ios alasset phasset cross-device

我实际上正在创建一个iOS应用程序,并希望在SQLite数据库中存储有关Photo Library图片的一些细节.我也希望能够在用户拥有的不同设备上共享这些数据(想象有人想在他的iPhone上重新组织图片,并希望在他的iPad中检索相同的订单).

我搜索了Apple文档,但未找到任何PHAsset跨设备共享的标识符.我也试图检查PHImageFileURLKey,hashValuelocalIdentifierPHAsset地方共享,但他们都不是.

有人已经做过这样的事吗?

hol*_*ann 5

目前没有。PHAsset 在第一个 iOS 8 Beta 中有一个共享标识符,但后来被删除了。


Fal*_*ler 5

自 iOS 15 起,有一个可在所有设备上使用的标识符:https://developer.apple.com/documentation/photokit/phcloudidentifier

API 非常简单。这个想法是,您存储并同步云标识符,然后使用它们来检索本地标识符,然后您可以像以前一样将其与现有 API 一起使用。您可以批量请求云标识符,如下所示:

let localIdentifiers = <your-list-of-local-identifiers>
let mappings: [String: Result<PHCloudIdentifier, Error>] = 
  PHPhotoLibrary.shared().cloudIdentifierMappings(forLocalIdentifiers: localIdentifiers)
Run Code Online (Sandbox Code Playgroud)

您可以使用该stringValue属性来存储此类标识符。

反之亦然(假设您有一个cloudIdentifiers包含标识符字符串值的列表):

let localIdentifiers: [PHCloudIdentifier: Result<String, Error>]
   = PHPhotoLibrary
        .shared()
        .localIdentifierMappings(
          for: cloudIdentifiers.map(PHCloudIdentifier.init(stringValue:)))
Run Code Online (Sandbox Code Playgroud)

可能会发生什么错误?

  • 未找到标识符:您传入的标识符无效或资产已被删除
  • 找到云标识符的多个本地标识符(根据 WWDC,如果“云状态不同步或库依赖图像内容来查找匹配项”,则会发生这种情况)有关错误处理的更多信息请参见此处

我通过实验得出的其他见解:

  • 即使根本没有登录 iCloud 帐户,您似乎也可以在没有互联网的情况下获取云标识符,并且为您的应用程序禁用 iCloud。
  • 尽管文档声明这是一项昂贵的操作,但一次加载数百个标识符的开销对我来说并不明显

  • 现在这应该是公认的答案。它工作完美。 (2认同)