You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:03:24