Canopy

Canopy 帮助你编写更好、更可测试的 CloudKit 应用。

安装 Canopy

Canopy 以 Swift Package Manager 包的形式分发。

如果你使用 Xcode UI 管理你的依赖项,请添加 https://github.com/Tact/Canopy 作为你项目的依赖项。

如果你使用 SPM Package.swift,请添加这个

dependencies: [
  .package(
    url: "https://github.com/Tact/Canopy",
    from: "0.5.0"
  )
]

使用 Canopy

一行代码示例

要从 CloudKit 私有数据库中获取 record ID 为 exampleID 的记录,请使用这个 Canopy 调用

let result = await Canopy().databaseAPI(usingDatabaseScope: .private).fetchRecords(with: [CKRecord.ID(recordName: "exampleID")])
switch result {
  case .success(let fetchRecordsResult):
    // handle fetchRecordsResult. Examine its foundRecords and notFoundRecordIDs properties.
  case .failure(let ckRecordError):
    // handle error
}

使用抛出式返回类型

Canopy 将其所有 API 都以 async Result 的形式提供。许多人更喜欢使用抛出式 API。使用 get() API,可以很容易地在调用点将 Canopy API 调用转换为抛出式风格。对于上面的例子,请按照这种方法操作

do {
  let result = try await Canopy().databaseAPI(usingDatabaseScope: .private).fetchRecords().get()
  // use result
} catch {
  // handle thrown error
}

依赖注入以实现可测试性

Canopy 的设计旨在使你的代码可测试。你需要通过在你的大部分代码和功能中使用 依赖注入 模式来完成你的部分工作。你的大部分代码不应直接实例化 Canopy,而应从外部接收它。例如

actor MyService {
  private let canopy: CanopyType
  init(canopy: CanopyType) {
    self.canopy = canopy
  }

  func someFeature() async {
    let databaseAPI = await canopy.getDatabaseAPI(usingDatabaseScope: .private)
    // call databaseAPI functions to
    // retrieve and modify records, zones, subscriptions …
  }
}

在你的应用的实际使用中,你初始化并注入与 CloudKit 通信的真实 Canopy 对象。当独立测试你的功能时,你则注入一个模拟 Canopy 对象,该对象不与任何云服务通信,而是回放模拟响应。

了解更多: 使用 Canopy 构建可测试的 CloudKit 应用

使用 swift-dependency 进行依赖注入

Canopy 为 swift-dependencies 实现了 cloudKit 依赖键。如果你使用 swift-dependencies,你可以像这样使用 Canopy

struct MyFeature {
  @Dependency(\.cloudKit) private var canopy
  func myFeature() async {
    let recordsResult = await canopy.databaseAPI(usingDatabaseScope: .private).fetchRecords()
  }
}

请参阅 swift-dependencies 文档以获取关于如何使用依赖项的更多信息,以及为你的预览和测试注入 Canopy 依赖项的所需值。

了解 Canopy

Canopy 包包含三个部分。

库提供了 Canopy 的主要功能和价值。Canopy 是主库,CanopyTestTools 帮助你构建测试。

文档

Canopy 文档站点位于 https://canopy-docs.justtact.com,其中包含库的文档,以及关于库的动机和关于使用 CloudKit 的一些想法和最佳实践的信息。该文档由 DocC 从此仓库生成,也可以在 Xcode 中内联使用。

文档的一些亮点

Canopy 的动机和范围

使用 Canopy 构建可测试的 CloudKit 应用

iCloud 高级数据保护

示例应用

Thoughts 示例应用展示了在真实应用中使用 Canopy,并演示了现代多平台、多窗口应用开发的一些最佳实践。

Thoughts 示例应用

作者和鸣谢

Canopy 是作为 Tact app 的一部分构建的,并将继续构建。

主要贡献者: Jaanus Kase, Andrew Tetlaw, Henry Cooper

感谢: Priidu Zilmer, Roger Sheen, Margus Holland