请参阅下面的更新问题:
我正在使用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消息。如果她重新启动应用程序,它会工作。我可以在一些地方使用一些想法来查看..我已经使用我自己的计算机和一个新的测试帐户确认了这种行为。
答案 0 :(得分:2)
根据文件,
仅当ubiquityIdentityToken属性中的值不为时,私有数据库才可用。
有时,您的应用可能无法使用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
}
}
它基本上做了以下......
这是一个黑客,200毫秒是任意的。到目前为止,似乎有效。