PHAsset(或 ALAsset)跨设备标识符

PHAsset (or ALAsset) cross-device identifier

我实际上正在创建一个 iOS 应用程序,并希望在 SQLite 数据库中存储有关照片库图片的一些详细信息。我还希望能够在用户拥有的不同设备之间共享此数据(假设有人想在他的 iPhone 上重新组织图片,并想在他的 iPad 中检索相同的顺序)。

我搜索了整个 Apple 文档,但没有找到任何跨设备共享的 PHAsset 标识符。我还尝试检查 PHAssetPHImageFileURLKeyhashValuelocalIdentifier 是否共享,但其中 none 是共享的。

有人做过这样的事情吗?

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

看起来,对于所有已与 iTunes 同步的 PHAsset,localIdentifier 是相同的,即使是跨设备也是如此。意思是:如果您从一台设备导入图像并将它们同步到另一台设备,则 PHAsset 的 localIdentifier 是相同的。

自 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)

您可以使用 stringValue 属性.

存储此类标识符

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

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

会发生什么错误?

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

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

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