检测 iCloud 存储中超出配额

问题描述 投票:0回答:1

我正在尝试检测用户的 iCloud 存储空间何时已满,以便我可以在我的应用程序中添加一条特殊消息。 我已经填满了我的 iCloud 存储空间,因此当我运行我的应用程序时,我收到以下错误:

错误:CoreData+CloudKit:-NSCloudKitMirroringDelegate _requestAbortedNotInitialized:: - 从未成功初始化,并且由于错误而无法执行请求“ 51383346-87BA-44D8-B527-A0B1EE35A0EF”:defaultOwner_) = 2FC9A487-D630-444D-B7F4-27A0F3A6B46E:(com.apple.coredata.cloudkit.zone:_defaultOwner_) = 903DD6A0-0BD8-46C0-84FB-E89797514D9F:(com.apple.coredata.cloudkit.zone:_defaultOwner_)= 。 }>

我尝试使用类似于 NSPersistentCloudKitContainer: How to check if data is synced to CloudKit 的代码以在有 CloudKit 事件时获取回调,但我从未收到 .quotaExceeded 错误代码,并且partialErrorsByItemID 始终为空。

有关如何检测超出 iCloud 配额的任何建议?

ios swift macos core-data cloudkit
1个回答
0
投票

您可以为 NSPersistentCloudKitContainer.eventChangedNotification 添加观察者 - 请参阅 Apple 的示例代码“在 iCloud 用户之间共享核心数据对象”。

NotificationCenter.default.addObserver(self, selector: #selector(containerEventChanged(_:)),
                                       name: NSPersistentCloudKitContainer.eventChangedNotification,
                                       object: container)

在“containerEventChanged”函数中,检查是否存在部分错误。正如https://developer.apple.com/documentation/cloudkit/ckerror中所述:

使用partialErrorsByItemID属性来访问一个字典 将 CloudKit 无法处理的项目映射到描述这些项目的错误 失败。

varpartialErrorsByItemID:[AnyHashable:任何错误]? {得到}

该属性的值是一个字典,它将项目 ID 映射到 错误。

它看起来像这样:

@objc func containerEventChanged(_ notification: Notification) {
    guard let value = notification.userInfo?[NSPersistentCloudKitContainer.eventNotificationUserInfoKey],
          let event = value as? NSPersistentCloudKitContainer.Event else {
        print("\(#function): Failed to retrieve the container event from notification.userInfo.")
        return
    }

    if let error = event.error as? CKError {
        switch error.code {
        case .partialFailure:
            if let partialError = error.userInfo[CKPartialErrorsByItemIDKey] as? NSDictionary {
                if !partialError.compactMap({ ($0.value as? CKError)?.code == .quotaExceeded }).isEmpty {
                    print("Quota Exceeded!")
                }
            }
        case .quotaExceeded:
            print("Quota Exceeded!")
        default:
            print(error)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.