如何检测用户CloudKit存储配额已耗尽——基于NSPersistentCloudKitContainer
检测CloudKit空间已满的可靠方案(CoreData + NSPersistentCloudKitContainer)
方法1:监听远程变更同步错误
当CloudKit空间满时,同步过程会抛出CKErrorQuotaExceeded错误,可通过监听CoreData的远程变更通知捕获这类错误:
- 注册
NSPersistentStoreRemoteChangeNotification通知:NotificationCenter.default.addObserver( forName: .NSPersistentStoreRemoteChange, object: persistentContainer.persistentStoreCoordinator, queue: .main ) { notification in guard let userInfo = notification.userInfo, let transitionErrors = userInfo[NSPersistentStoreUbiquitousTransitionKey] as? [Error] else { return } for error in transitionErrors { if let ckError = error as? CKError, ckError.code == .quotaExceeded { // 检测到CloudKit配额已满,执行对应处理逻辑 print("CloudKit空间已满,同步停止") } } }
方法2:主动查询CloudKit存储用量
直接调用CloudKit API查询当前容器的已用空间和总配额,提前判断是否即将耗尽:
let container = CKContainer.default() container.fetchQuotaUsage { usage, error in if let error = error { // 处理查询错误 return } guard let usage = usage else { return } container.accountStatus { status, error in if status == .available { // 默认个人iCloud账户配额为5GB,团队账户配额需根据实际情况调整 let defaultQuota: UInt64 = 5 * 1024 * 1024 * 1024 if usage >= defaultQuota { // 空间已满 print("CloudKit空间已耗尽") } else if usage >= defaultQuota * 0.9 { // 空间即将耗尽,提示用户清理 print("CloudKit空间即将不足") } } } }
注意:iOS 15+可通过
CKAccountInfo获取更准确的账户配额信息,替代默认值判断。
方法3:捕获持久化存储加载/同步错误
在初始化NSPersistentCloudKitContainer时,处理添加持久化存储的错误,检查是否包含CloudKit配额超限情况:
lazy var persistentContainer: NSPersistentCloudKitContainer = { let container = NSPersistentCloudKitContainer(name: "YourModelName") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { // 遍历错误链,查找CloudKit相关错误 var currentError: Error = error while let underlyingError = currentError.userInfo[NSUnderlyingErrorKey] as? Error { currentError = underlyingError if let ckError = currentError as? CKError, ckError.code == .quotaExceeded { // 检测到配额已满 print("CloudKit空间已满,无法加载同步存储") break } } } }) return container }()
内容的提问来源于stack exchange,提问作者user5842263
相关产品推荐
相关产品推荐

