PHAsset(或 ALAsset)跨设备标识符
PHAsset (or ALAsset) cross-device identifier
我实际上正在创建一个 iOS 应用程序,并希望在 SQLite 数据库中存储有关照片库图片的一些详细信息。我还希望能够在用户拥有的不同设备之间共享此数据(假设有人想在他的 iPhone 上重新组织图片,并想在他的 iPad 中检索相同的顺序)。
我搜索了整个 Apple 文档,但没有找到任何跨设备共享的 PHAsset
标识符。我还尝试检查 PHAsset
的 PHImageFileURLKey
、hashValue
或 localIdentifier
是否共享,但其中 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。
- 尽管文档指出这是一项昂贵的操作,但一次加载数百个标识符的开销对我来说并不明显
我实际上正在创建一个 iOS 应用程序,并希望在 SQLite 数据库中存储有关照片库图片的一些详细信息。我还希望能够在用户拥有的不同设备之间共享此数据(假设有人想在他的 iPhone 上重新组织图片,并想在他的 iPad 中检索相同的顺序)。
我搜索了整个 Apple 文档,但没有找到任何跨设备共享的 PHAsset
标识符。我还尝试检查 PHAsset
的 PHImageFileURLKey
、hashValue
或 localIdentifier
是否共享,但其中 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。
- 尽管文档指出这是一项昂贵的操作,但一次加载数百个标识符的开销对我来说并不明显