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

#1楼 票数: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)
}

#2楼 票数: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)
}

它可能听起来没用,但在我的情况下,它帮助我解决了Server Rejected Request" (15/2000)错误,修复了我的应用程序的一个功能,并继续使用其他功能相关的代码比我更少的努力思想。

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

#3楼 票数:0

只是另一个数据点可能有助于整体情况。 当我在运行名为discoverAllIdentitiesWithCompletionHandler的测试应用程序时使用自己的iCloud AppleID(有数百个联系人)时,我仍然在11.2.5上看到此错误。 我会得到可怕的CKError 0x1c0051730:“服务器拒绝请求”(15/2000); server message =“内部服务器错误”。 当我切换到我的女儿iOS11.2.5设备上运行完全相同的代码(只有少数几个联系人)时,代码工作正常。 让我相信当iOS11有很多联系时会有一些速率限制。 (PS在iOS10上完全没有错误)

  ask by Hunter Monk translate from so

未解决问题?本站智能推荐:

2回复

为什么找不到iCloud帐户/ CKContainer

请在下面查看我的更新问题: 我正在使用CloudKit开发我的第一个应用程序。 寻找交易之前,我正在尝试测试用户是否已连接到iCloud。 这是我的代码(显示各种测试): 我自己的帐户可以正常使用-我可以按预期工作。 但是,对于新用户(例如Apple Review团队和我
2回复

从 iOS 10.3 开始,discoverAllIdentities 和 discoverUserIdentity 为 CKUserIdentity.lookupInfo 返回 nil

CKContainer.discoverAllIdentities(completionHandler:),discoverUserIdentity(recordID: - 完成处理程序返回 CKUserIdentity 但 .lookupInfo 始终为零,即使联系人包含电子邮件、电话等。其他属
2回复

无法通过应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit、Swift

我想通过应用程序扩展(更具体地说是手表应用程序)访问 CloudKit 中的一些数据。 在我的主应用程序中,我只是像这样创建我的容器: CKContainer(identifier: "myContainerID")然后调用私有数据库上的任何方法 在我的应用程序扩展中,我使用完全相同的代码创建了一
1回复

在保存信息Swift2时CloudKit总是会出错

如果我尝试将测试信息保存到CloudKit我总是会出错 我的代码是 我的数据库看起来像 有人可以向我解释我做错了什么吗?
1回复

CloudKit ModifyRecordsCompletionBlock随机失败

此应用程序使用CloudKit在本地设备上记录存储和核心数据。 本地创建的记录将保存到核心数据。 调用以下方法将本地创建的记录发送到CloudKit。 我在应用程序启动时以及从后台返回时调用此方法。 我还为测试阶段编写了一个调用此方法的按钮。 该行为似乎是完全随机的。 例如,如果
1回复

如何使用discoverAllIdentities从CloudKit更新uitableview

所以,我是cloudKit的新手,并且一般都使用多个线程,我认为这是问题的根源,所以如果我只是需要进行更多的研究,那么请对此进行评论,我会将其铭记于心。 这是我的问题: 我在Swift 3 Xcode 8.1中工作 我在视图控制器中有这个变量: 然后在ViewDidLo
1回复

我可以将CKRecords从一个CKContainer移到另一个吗?

我不得不更改自己的Apple ID,但是在生产环境中的旧Apple ID容器中有许多重要记录。 我可以在保持依赖关系和记录作者的同时导出它们吗?
1回复

在ios 7设备的CKContainer.defaultContainer()处中断

在ios 7设备上调试应用程序时,尽管它适用于ios 8设备,但仍收到以下中断: 代码的突出显示中断的部分如下: 为ios 7和8声明defaultcontainer有什么区别?