@CloudStorage 属性包装器

通过 iCloud 键值存储同步设置。

这是什么?

类似于 iOS14 中的 @AppStorage@SceneStorage,这个 @CloudStorage 属性包装器可以在应用重启后持久保存数值。除此之外,它还能使用 iCloud 键值存储 在设备之间同步这些数值。

用法

步骤 1:启用 iCloud “键值存储” 服务

  1. 在 Xcode 中选择你的项目文件,选择 target 并点击 “Signing & Capabilities”
  2. 点击左上角的 “+ Capability” 按钮
  3. 搜索 “iCloud” 并添加 capability
  4. 启用 “Key-value storage” 服务
📺 观看此操作的屏幕录像

Screen recording

步骤 2:将此库添加为 SPM 依赖

点击 File -> Add Packages... 并粘贴此 GitHub 仓库的 URL 以将其添加到你的项目。

步骤 3:使用属性包装器

这些数值将在你的应用用户设备之间同步

@CloudStorage("readyForAction") var readyForAction: Bool = false
@CloudStorage("numberOfItems") var numberOfItems: Int = 0
@CloudStorage("orientation") var orientation: String?

另请参阅此仓库中的示例应用。

应该用于什么?

与键值存储本身相同的注意事项也适用

键值存储适用于离散值,例如偏好设置、设置和简单的应用状态。

使用 iCloud 键值存储来存储少量数据:股票或天气信息、位置、书签、最近文档列表、设置和偏好设置以及简单的游戏状态。每个提交到 App Store 或 Mac App Store 的应用都应该利用键值存储。

摘自 Apple 关于 选择合适的 iCloud 存储 API 的文档

通常,键值存储并非旨在作为通用同步服务。如果你需要任何高级功能来防止数据丢失,请考虑改用 CloudKit。

在应用和扩展之间同步

要在不同的应用(来自同一团队)之间,甚至在应用及其扩展之间同步相同的键值项,请按照以下步骤操作

  1. 将其中一个应用指定为主应用
  2. 在其他应用/扩展中,手动更改 iCloud 键值存储 ID,使其与主应用相同

例如,如果你的主应用的 bundle identifier 是 com.example.my-app,并且其 .entitlements 文件有以下条目

<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>$(TeamIdentifierPrefix)$(CFBundleIdentifier)</string>

请确保在其他应用或扩展中配置 .entitlements 文件,如下所示

<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>$(TeamIdentifierPrefix)com.example.my-app</string>

另请参阅:为多个应用配置通用的 iCloud 容器 (developer.apple.com)

作者

Nonstrict B.V., Tom Lokhorst & Mathijs Kadijk, 根据 MIT 许可证 发布