为什么找不到iCloud帐户/ CKContainer

时间:2017-01-11 23:12:48

标签: swift swift3 icloud cloudkit

请参阅下面的更新问题:

我正在使用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消息。如果她重新启动应用程序,它会工作。我可以在一些地方使用一些想法来查看..我已经使用我自己的计算机和一个新的测试帐户确认了这种行为。

2 个答案:

答案 0 :(得分:2)

根据文件,

  

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

It also says

  

有时,您的应用可能无法使用iCloud,例如当用户停用“文档”和“数据功能或标志   icloud的

文档和数据现在显然在设置中被称为 iCloud Drive

所以我会询问有问题的用户是否启用了他们的iCloud Drive设置,如果打开它会产生任何差异。

答案 1 :(得分: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毫秒再试一次。
  3. 这是一个黑客,200毫秒是任意的。到目前为止,似乎有效。