CloudKitSyncMonitor
是一个 Swift 包,它监听 NSPersistentCloudKitContainer
发送的通知,并将这些通知转换为已发布的属性,从而为你的应用程序提供实时的同步状态信息。
此包解决了 CloudKit(以及因此你的应用程序)可能在没有警告或用户通知的情况下停止同步的关键问题。CloudKitSyncMonitor
提供对此类情况的即时检测,使你能够立即通知用户并采取适当的措施。
NSPersistentCloudKitContainer
通知来监视同步状态SyncMonitor
类,可以通过 SyncMonitor.default
单例方便地访问SyncMonitor
主动订阅来自关键系统组件的通知
NSPersistentCloudKitContainer
: 用于核心同步事件监视CKContainer
: 用于跟踪 CloudKit 特定的状态NWPathMonitor
: 用于网络状态更新重要提示
SyncMonitor.default.startMonitoring()
,最好是在你的应用程序委托或初始视图中。
SyncMonitor
在两个不同的粒度级别提供同步信息
syncStateSummary
属性提供了一个高级枚举,总结了整体同步状态。这非常适合快速状态检查和面向用户的信息。
SyncMonitor
跟踪 NSPersistentCloudKitContainer
的三种主要事件类型的状态
为了监视这些事件,SyncMonitor
提供了相应的属性
setupState
: 跟踪设置事件的状态importState
: 监视导入事件的状态exportState
: 跟踪导出事件的状态这些属性提供了关于每个同步阶段的全面信息,包括用于提取常用详细信息的便捷方法。
SyncMonitor
提供了强大的工具来识别同步问题
hasSyncError
: 一个布尔值,指示是否存在任何与同步相关的错误isNotSyncing
: 检测到同步应该正常运行但没有按预期运行的情况setupError
: 捕获同步设置阶段的问题importError
: 识别从 CloudKit 导入数据的问题exportError
: 突出显示导出数据到 CloudKit 时的问题isNotSyncing
属性对于检测微妙的同步问题特别有用
NSPersistentCloudKitContainer
无法启动同步及时准确的错误检测对于维护数据完整性和用户信任至关重要
setupState
, importState
, 和 exportState
属性提供了对同步过程的全面见解
显示详细同步状态的用法示例
fileprivate var dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .short
return dateFormatter
}()
print("Setup state: \(stateText(for: SyncMonitor.default.setupState))")
print("Import state: \(stateText(for: SyncMonitor.default.importState))")
print("Export state: \(stateText(for: SyncMonitor.default.exportState))")
func stateText(for state: SyncMonitor.SyncState) -> String {
switch state {
case .notStarted:
return "Not started"
case .inProgress(started: let date):
return "In progress since \(dateFormatter.string(from: date))"
case let .succeeded(started: _, ended: endDate):
return "Succeeded at \(dateFormatter.string(from: endDate))"
case let .failed(started: _, ended: endDate, error: _):
return "Failed at \(dateFormatter.string(from: endDate))"
}
}
有关所有可用属性和方法的更多详细信息,请参阅全面的 SyncMonitor 文档。
private let syncMonitor = SyncMonitor.default
if syncMonitor.hasSyncError {
if let error = syncMonitor.setupError {
print("Unable to set up iCloud sync, changes won't be saved! \(error.localizedDescription)")
}
if let error = syncMonitor.importError {
print("Import is broken: \(error.localizedDescription)")
}
if let error = syncMonitor.exportError {
print("Export is broken - your changes aren't being saved! \(error.localizedDescription)")
}
} else if syncMonitor.isNotSyncing {
print("Sync should be working, but isn't. Look for a badge on Settings or other possible issues.")
}
import SwiftUI
import CloudKitSyncMonitor
struct SyncStatusView: View {
@StateObject private var syncMonitor = SyncMonitor.default
var body: some View {
if syncMonitor.syncStateSummary.isBroken {
Image(systemName: syncMonitor.syncStateSummary.symbolName)
.foregroundColor(syncMonitor.syncStateSummary.symbolColor)
}
}
}
import SwiftUI
import CloudKitSyncMonitor
struct SyncStatusView: View {
@StateObject private var syncMonitor = SyncMonitor.default
var body: some View {
Image(systemName: syncMonitor.syncStateSummary.symbolName)
.foregroundColor(syncMonitor.syncStateSummary.symbolColor)
}
}
if syncMonitor.syncStateSummary.isBroken || syncMonitor.syncStateSummary.isInProgress {
Image(systemName: syncMonitor.syncStateSummary.symbolName)
.foregroundColor(syncMonitor.syncStateSummary.symbolColor)
}
if case .accountNotAvailable = syncMonitor.syncStateSummary {
Text("Hey, log into your iCloud account if you want to sync")
}
将以下内容添加到你的 Package.swift
dependencies: [
.package(url: "https://github.com/ggruen/CloudKitSyncMonitor.git", from: "3.0.0"),
],
targets: [
.target(
name: "MyApp", // Where "MyApp" is the name of your app
dependencies: ["CloudKitSyncMonitor"]),
]
https://github.com/ggruen/CloudKitSyncMonitor.git
3.0.0
作为最低版本。要返回使用 github 版本,只需从侧边栏中删除 CloudKitSyncMonitor(单击它,按删除键,选择删除引用)- Xcode 应回退到你使用上面的安装说明添加的版本。如果你尚未将其安装为包依赖项,则只需从侧边栏中删除它,然后使用上面的安装说明将其添加为包依赖项。
如果你发现错误、有建议或问题等,也可以提交 issues。 🐛💡❓