我的CloudKit应用中的CKContainer.discoverAllIdentities
请求始终失败。它在几天的过程中不断失败。
失败的代码的简化版本(导致相同的错误)是:
private func getContacts(completion: (([CKUserIdentity]?) -> Void)?) {
container.status(forApplicationPermission: .userDiscoverability) { [weak self] status, error in
if let error = error {
print(error)
}
switch status {
case .granted:
self?.discover(completion: completion)
default:
print("status not granted")
}
}
}
private func discover(completion: (([CKUserIdentity]?) -> Void)?) {
let op = CKDiscoverAllUserIdentitiesOperation()
op.qualityOfService = .userInitiated
op.discoverAllUserIdentitiesCompletionBlock = { error in
if let error = error {
print(error)
}
}
op.userIdentityDiscoveredBlock = { identity in
print(identity)
}
op.start()
}
导致错误传递给op.discoverAllUserIdentitiesCompletionBlock
。日志中的错误描述为:
<CKError 0x1c4a51a60: "Server Rejected Request" (15/2000); server message = "Internal server error"; uuid = F67453B9-712D-4E5E-9335-929123E3C978; container ID = "iCloud.com.huntermaximillionmonk.topdraw">
以前,此操作可以使用,但仅适用于某些iCloud用户。现在它不适合我的两个测试用户。
答案 0 :(得分:3)
这是iOS 11.0
这在设备(非模拟器)上的Xcode 9.2
/ iOS 11.2.1
无效
重置模拟器后第一次工作,随后不起作用,但在设备上重复工作。
let queue = OperationQueue()
func requestPermissions(for permissions: CKApplicationPermissions,
completionHandler: @escaping (CKApplicationPermissionStatus, Error?) -> ()) {
CKContainer.default().requestApplicationPermission(permissions) { status, error in
if let error = error {
print("Error for requesting \(permissions) - \(error)")
}
let statusMessage : String
switch status {
case .granted:
statusMessage = "Granted"
case .denied:
statusMessage = "Denied"
case .couldNotComplete:
statusMessage = "Could not complete"
case .initialState:
statusMessage = "Initial state"
}
print("Permission - \(statusMessage)")
completionHandler(status, error)
}
}
private func discoverAllUsers() {
let operation = CKDiscoverAllUserIdentitiesOperation()
operation.userIdentityDiscoveredBlock = { userIdentity in
print("userIdentity = \(userIdentity)")
}
operation.discoverAllUserIdentitiesCompletionBlock = { error in
if let error = error {
print("Discover all users Error: \(error) ")
}
else {
print("Discover all users completed successfully")
}
}
queue.addOperation(operation)
}
答案 1 :(得分:2)
这实际上不是问题的答案,而是帮助我克服这个错误的修复。它将要求您更改应用程序UI交互并将ContactsUI框架添加到项目中,此外,您的用户将负责选择与iCloud相关电子邮件的联系人。
好消息是方法 url(_(r'^post/(?P<pk>\d+)-(?P<slug>[-\w]+)/$'), views.PostDetailView.as_view(), name='post_detail'),
仍然有效。因此,您可以使用它从手动选择的联系人中获取discoverUserIdentity
。
CKUserIdentity
这可能听起来没用,但在我的情况下,它帮助我解决了func addContact(_ contact:CNContact) {
var lookUpEmails = [CKUserIdentityLookupInfo]()
for email in contact.emailAddresses {
lookUpEmails.append(CKUserIdentityLookupInfo(emailAddress: (email.value as String)))
}
let checkUserOperation = CKDiscoverUserIdentitiesOperation()
checkUserOperation.userIdentityLookupInfos = lookUpEmails
checkUserOperation.userIdentityDiscoveredBlock = { [unowned self] (identity, info) -> Void in
if identity.hasiCloudAccount {
if let recordID = identity.userRecordID {
//do something with discovered user
}
checkUserOperation.cancel()
}
}
checkUserOperation.queuePriority = Operation.QueuePriority.high
CKContainer.default().add(checkUserOperation)
}
错误,修复了我的应用程序的一个功能,并继续使用其他功能相关的代码而不是我想象的那么努力
我希望有人会觉得这很有帮助。
答案 2 :(得分:0)
关于此的另一个数据点可能有助于整体情况。当我在运行名为discoverAllIdentitiesWithCompletionHandler的测试应用程序时使用自己的iCloud AppleID(有数百个联系人)时,我仍然在11.2.5上看到此错误。我会害怕的 CKError 0x1c0051730:“服务器拒绝请求”(15/2000); server message =“内部服务器错误”。 当我切换到我的女儿iOS11.2.5设备上运行完全相同的代码(只有少数几个联系人)时,代码工作正常。 让我相信当iOS11有很多联系时会有一些速率限制。 (P.S.在iOS10上没有错误运行)