【问题标题】:Detect not accessibility of iCloud from iOS app从 iOS 应用程序检测到 iCloud 的不可访问性
【发布时间】:2020-04-09 00:42:21
【问题描述】:

我正在开发使用 iCloud 备份和恢复应用数据的应用。 为此,我使用以下代码访问 iCloud 以在其中写入我的数据。

    if let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil) {
        var iCloudDocumentsURL = iCloudDocumentsURL
        do {
            iCloudDocumentsURL = iCloudDocumentsURL.appendingPathComponent("Documents")
            try FileManager.default.createDirectory(at: iCloudDocumentsURL, withIntermediateDirectories: true, attributes: nil)
        }
        catch {
            completion(false, error.localizedDescription)
        }
        let fileURL = iCloudDocumentsURL.appendingPathComponent(file)
        //writing
        do {
            try text.write(to: fileURL, atomically: false, encoding: .utf8)
            completion(true, nil)
        }
        catch {
            completion(false, error.localizedDescription)
        }
    }
    else {
        completion(false, "iCloud is not accessible")
    }

但是,如果用户没有登录 iCloud,那么它也会给我“无法访问 iCloud”,或者如果用户登录了 iCloud 但禁用了我的应用程序的 iCloud 访问,那么我也会收到相同的消息。

那么,无论如何,我怎样才能检测到类似这种具有不同状态的错误。因为我想向用户提供适当的消息,以便他可以使用我的应用程序的某些功能。 我还想知道如何检测用户的 iCloud 存储空间是否已满并且我正在尝试写入 iCloud 存储空间。 如何检测 iCloud 的可用空间?

【问题讨论】:

    标签: ios swift icloud icloud-drive


    【解决方案1】:

    in the Apple Developer Documentation 指定了许多不同的 iCloud 错误代码。

    你特别感兴趣的是NSUbiquitousFileNotUploadedDueToQuotaError

    NSUbiquitousFileNotUploadedDueToQuotaError
    该项目无法上传到 iCloud,因为它会使帐户超出其 配额。

    【讨论】:

    • 这个错误什么时候会抛出?我的意思是当我尝试在 iCloud 中写作时?我应该添加更多代码来处理这些错误吗?还是我的 try catch 块就够了?
    • @MrugeshTank 您可以按照我的答案中的链接查看详细信息。它说如果“该项目无法上传到 iCloud,因为它会使帐户超出其配额”,则会抛出 NSUbiquitousFileNotUploadedDueToQuotaError。所以是的,当你尝试写入 iCloud 时它会抛出。
    【解决方案2】:

    您的第一个 if 语句每次都失败,因为您需要提供一个实际的字符串值作为容器标识符。

    请参阅文档here

    如果你为这个参数指定 nil,这个方法返回第一个 中列出的容器 com.apple.developer.ubiquity-container-identifiers 权利数组。

    您的info.plist 中肯定有权利数组吗?这是完成这项工作所必需的。或者将其声明为字符串。


    您可以通过检查 ubiquityIdentityToken 属性来检查 iCloud 帐户是否可用。

    要确定 iCloud 是否可用,尤其是在启动时,请检查 而是 ubiquityIdentityToken 属性的值。

    如果用户更改他们在设备上使用的帐户,此令牌将会更改。如果帐户不可用,它将返回nil

    【讨论】:

    • 当用户登录并启用对我的应用程序的访问时,我可以访问 iCloud。访问代码没有任何问题。我只想正确处理错误。
    • 我是否应该先检查 ubiquityIdentityToken 以检查 iCloud 是否已登录,然后再检查 iCloud URL?还是您建议的其他内容?
    猜你喜欢
    • 2015-07-30
    • 2016-01-07
    • 2016-02-26
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多