iCloud Drive 是苹果的云文件存储,内置于 iOS、macOS 和 iPadOS 中,用于在用户设备之间同步文档。根据 Apple, 2024 的数据,iCloud Drive 使用 CloudKit 作为后端来存储文件和自动同步:在 iPhone 上所做的更改会立即反映在 Mac 和 iPad 上,无需用户操作。开发人员可以通过 NSDocumentPickerViewController 和 Ubiquity API 将 iCloud Drive 集成到应用程序中。
要点
iCloud Drive 是苹果的云文件服务,为使用同一 Apple ID 授权的用户所有设备提供统一的文档存储。该服务于 2014 年与 iOS 8 和 OS X Yosemite 一起推出,作为 iCloud Documents 的替代品。
iCloud Drive 与其他云存储(Google Drive、Dropbox)的不同之处在于与操作系统的深度集成:文件直接显示在 macOS 的 Finder 和 iOS 的“文件”应用程序中,无需安装额外的应用程序。系统在后台自动同步内容,在 Wi-Fi 和蜂窝网络之间切换。
根据 Apple Platform Overview, 2024,iCloud Drive 支持长达 30 天的文件版本控制、通过 iCloud Sharing 共享文件夹以及与系统搜索 Spotlight 的集成。开发人员通过 NSFileCoordinator API 和 Ubiquity containers 访问存储。
Ubiquity — 苹果术语,表示数据「无处不在」的能力(源自英文 ubiquitous)。在 iCloud Drive 的背景下,这是一种通过 CloudKit 云后端使文件在用户所有设备之间自动同步的机制。
| 组件 | 描述 | 角色 |
|---|---|---|
| Ubiquity container | 应用程序的特殊目录 | 存储要同步的文件 |
| CloudKit | 苹果后端服务 | 提供存储和同步 |
| NSMetadataQuery | 系统查询 | 跟踪 Ubiquity 文件的状态 |
| NSFileVersion | 版本管理 | 解决更改冲突 |
Ubiquity container 是应用程序沙盒内标记为同步的目录。放置在此目录中的文件会自动上传到 iCloud Drive 并分发到其他设备。对容器的访问通过 Xcode 中的 Capabilities 进行配置。
系统通过 NSMetadataQuery 跟踪每个文件的状态:文件可以是本地的(已下载到设备)、远程的(仅在云中)或正在下载。开发人员可以通过编程方式请求下载文件或在打开前检查其可用性。
集成 iCloud Drive 从在 Xcode 中添加 iCloud capability 并启用 iCloud Documents 服务开始。之后,应用程序获得对 Ubiquity container 的访问权限——这是一个由 FileManager 返回路径的特殊目录。
import UIKit
class DocumentManager {
func ubiquityURL() -> URL? {
return FileManager.default
.url(forUbiquityContainer: nil)
}
func saveToICloud(data: Data, filename: String) {
guard let containerURL = ubiquityURL() else { return }
let fileURL = containerURL
.appendingPathComponent(filename)
do {
try data.write(to: fileURL)
Logger.storage.info(
"Saved \(filename) to iCloud Drive"
)
} catch {
Logger.storage.error(
"Save failed: \(error.localizedDescription)"
)
}
}
func listICloudFiles() {
let query = NSMetadataQuery()
query.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
query.start()
}
}
NSDocumentPickerViewController 提供用于从 iCloud Drive 选择和导入文件的系统 UI。用户会看到一个标准的文件浏览器,支持搜索、排序和多选。选择文件后,应用程序会收到其 URL,并可以通过 NSFileCoordinator 使用它。
重要规则: 在使用 iCloud Drive 文件时,必须使用 NSFileCoordinator 进行读取和写入。这保证了文件在操作期间不会被其他进程(例如同步)修改。忽略协调可能会导致数据损坏。
版本冲突 发生在文件在同步完成之前同时在两个设备上被修改时。iOS 通过 NSFileVersion 自动检测此类情况,并创建冲突版本,用户或应用程序必须解决这些冲突。
func resolveConflicts(for fileURL: URL) {
let conflictVersions = NSFileVersion
.unresolvedConflictVersionsOfItem(at: fileURL) ?? []
for version in conflictVersions {
do {
let conflictData = try Data(contentsOf: version.url)
let resolved = mergeData(
original: try Data(contentsOf: fileURL),
conflict: conflictData
)
try resolved.write(to: fileURL)
version.remove()
} catch {
Logger.sync.error(
"Conflict resolution failed: \(error)"
)
}
}
}
NSFileVersion 存储文件更改历史记录,最长 30 天。每个版本包含 URL、创建日期和创建设备的标识符。当两个设备使用相同的基本标识符发送更改时,系统会自动将版本标记为冲突。
解决策略: 应用程序可以自动合并更改(对于支持的格式)、向用户显示版本选择,或使用「最后写入者」策略(last-writer-wins)。苹果建议对于文本和结构化数据使用自动合并,对于二进制格式——向用户显示冲突版本。
免费存储 iCloud 为 5 GB,分配给用户的所有服务:备份、照片、邮件和 iCloud Drive。付费套餐从 50 GB 起,最高可达 12 TB。对于文件交换频繁的应用程序,考虑这些限制至关重要。
存储优化: iOS 提供了文件驱逐机制(eviction)——当本地空间不足时,系统可以删除 iCloud Drive 文件的缓存副本,只保留元数据。当尝试打开此类文件时,系统会自动从云中下载。开发人员可以通过 NSFileCoordinator 控制此过程,并通过 NSMetadataUbiquitousItemDownloadingStatusKey 检查文件状态。
根据 WWDC 2022,苹果建议以下优化 iCloud Drive 的实践:在 Ubiquity container 中仅存储用户文档,而不是应用程序缓存;使用带进度指示器的异步下载;在下载前向用户提供文件大小信息;为大文件实现断点续传支持。
关键细节: 从 Ubiquity container 中删除文件会导致其从用户所有设备中删除。对于临时文件,请使用本地 Documents 目录,而不是 Ubiquity container。同时请注意,同步并非即时——延迟可能从几秒到几分钟不等,具体取决于文件大小和网络。
常见问题
iCloud Drive 是苹果的云文件存储,可在 iPhone、iPad、Mac 和 PC 之间同步文档。它与 Finder 和“文件”应用程序集成,无需额外应用程序即可处理文档。
同步 通过 CloudKit 工作:来自应用程序 Ubiquity container 的文件会自动上传到云端并分发到用户的其他设备。系统使用 NSMetadataQuery 跟踪状态,使用 NSFileCoordinator 进行安全访问。
在 Xcode 中添加 iCloud capability,启用 iCloud Documents 服务,并使用 FileManager.url(forUbiquityContainer:) 获取同步目录的路径。使用 NSDocumentPickerViewController 选择文件。
iOS 通过 NSFileVersion 创建 冲突版本。开发人员可以自动合并更改或向用户显示选择。系统将版本保存最多 30 天,并在不同设备同时更改时自动标记冲突。
免费 提供 5 GB 用于所有 iCloud 服务。付费套餐:50 GB、200 GB、2 TB、6 TB 和 12 TB。对于大文件,实现断点续传支持,并在写入前检查可用空间。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。