【问题标题】:Why is iCloud account/CKContainer not being found为什么找不到 iCloud 帐户/CKContainer
【发布时间】:2017-05-26 22:17:21
【问题描述】:

请在下面查看我更新的问题:

我正在使用 CloudKit 开发我的第一个应用程序。在查找交易之前,我正在尝试测试用户是否已连接到 iCloud。

这是我的代码(显示各种测试):

func isICloudContainerAvailable()->Bool {

        CKContainer.default().accountStatus { (accountStat, error) in
            if (accountStat == .available) {
                print("iCloud is available")
            }
            else {
                print("iCloud is not available")
            }
        }

        CKContainer.default().accountStatus { (accountStatus, error) in
            switch accountStatus {
            case .available:
                print("iCloud Available")
            case .noAccount:
                print("No iCloud account")
            case .restricted:
                print("iCloud restricted")
            case .couldNotDetermine:
                print("Unable to determine iCloud status")
            }
        }


        if FileManager.default.ubiquityIdentityToken != nil {
            //print("User logged in")
            return true
        }
        else {
            //print("User is not logged in")
            return false
        }
    }

这适用于我自己的帐户——我可以按预期工作。但是,对于新用户(即 Apple Review 团队和我自己的测试用户),我会得到

iCloud 不可用,并且 没有 iCloud 帐户

我确定有一个打开的 iCloud 帐户,因为新用户的 iCloud 邮件正在工作。

更新

我有一个测试用户退出并再次登录。她第一次启动应用程序时,会收到 noCloud 消息。如果她重新启动应用程序,它就会工作。我可以使用一些想法来查看位置。我已使用我自己的计算机和一个新的测试帐户确认了这种行为。

【问题讨论】:

  • ubiquityIdentityToken 的值是多少?
  • 嗨 MirekE,它是空的

标签: swift swift3 icloud cloudkit


【解决方案1】:

根据文档,

只有当 ubiquityIdentityToken 属性中的值不为 nil 时,私有数据库才可用

It also says

有时 iCloud 可能对您的应用程序不可用,例如当用户禁用文档和数据功能或退出 iCloud.

Documents and Data 现在显然是“设置”中所谓的 iCloud Drive

所以我会询问有问题的用户是否启用了他们的 iCloud Drive 设置,以及打开它是否有任何不同。

【讨论】:

  • 会的。感谢您的帮助。我稍后会回到这里。同时,在其他用户可以使用我的应用之前,我是否需要将我的容器从开发迁移到生产?谢谢
  • 如果他们正在使用 TestFlight 测试您的应用程序,您需要将数据库部署到生产环境。如果您有任何初始数据,我相信您必须自己填充它们,部署过程不会复制它们。
  • 我取得了一些进展。该错误在应用程序第一次运行时发生。如果我停止应用程序并重新启动,它会像宣传的那样工作。这会响铃吗?
  • 不,抱歉。但是如果你得到.noAccount,你应该提示用户启用iCloud Drive。然后使用 NSUbiquityIdentityDidChangeNotification 检查凭据的更改。
  • 好的。感谢所有的帮助。我会留下这个问题,看看是否有其他人加入。
【解决方案2】:

我不会将此作为正确答案发布。但是,我从 Apple TSI 干预中了解到,这是一个 Apple 漏洞。一个建议的解决方法——我仍在测试如下:

func isICloudContainerAvailable()->Bool {
        print(#function)
        CKContainer.default().accountStatus { (accountStatus, error) in

            if accountStatus == .available {
                return
            }

            ///
            // Checking account availability
            // Silently return if everything goes well, or do a second check 200ms after the first failure
            //

            DispatchQueue.global().asyncAfter(deadline: .now() + 0.2) {

                    guard error != nil, accountStatus != CKAccountStatus.available else {return}

                        print("iCloud account is not available! Be sure you have signed in iCloud on this device!")
                    }
                }


        if FileManager.default.ubiquityIdentityToken != nil {
            //print("User logged in")
            return true
        }
        else {
            //print("User is not logged in")
            return false
        }

    }

它本质上做了以下事情..

  1. 检查容器是否可用。
  2. 如果没有,请等待 200 毫秒,然后再试一次。

这是一个 hack,200 毫秒是任意的。到目前为止,它似乎有效。

【讨论】:

  • 这段代码我看不懂:isICloudContainerAvailable() 立即返回的结果只取决于测试是否ubiquityIdentityTokennil。帐户状态的异步检查可能会返回不同的结果,除了日志之外,根本不使用。
猜你喜欢
  • 2014-01-23
  • 2014-09-15
  • 2015-11-27
  • 2012-10-03
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多