CKContainer.discoverAllIdentities总是失败

Hun*_*onk 9 swift cloudkit

CKContainer.discoverAllIdentities我的CloudKit应用程序中的请求总是失败.它在几天的过程中不断失败.

失败的代码的简化版本(导致相同的错误)是:

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()
}
Run Code Online (Sandbox Code Playgroud)

它会导致错误传递给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用户.现在它不适合我的两个测试用户.

Dim*_*lov 2

编辑:

苹果在这个答案发布后第二天就解决了这个问题,巧合吗?!我不这么认为:)


这实际上并不是问题的答案,而是帮助我克服这个错误的修复。它将要求您更改应用程序 UI 交互并将 ContactsUI 框架添加到您的项目中,此外您的用户将负责选择与 iCloud 相关的电子邮件的联系人。

好消息是该方法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)
}
Run Code Online (Sandbox Code Playgroud)

这可能听起来没什么用,但就我而言,它帮助我解决了Server Rejected Request" (15/2000)错误,修复了我的应用程序的一个功能,并继续使用其他功能相关的代码,比我想象的要少。

我希望有人会觉得这很有帮助。