CKContainer.discoverAllIdentities总是失败

时间:2017-08-16 00:23:10

标签: swift cloudkit

我的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用户。现在它不适合我的两个测试用户。

3 个答案:

答案 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上没有错误运行)