CKContainer.discoverAllIdentities始终失败 [英] CKContainer.discoverAllIdentities always fails
问题描述
CKContainer.discoverAllIdentities
请求始终在我的CloudKit应用中失败。在几天的时间内,它一直持续失败。
失败的代码的简化版本(导致相同的错误)是:
私有函数getContacts(完成:(([[CKUserIdentity]?)->无效)?){
container.status(forApplicationPermission: .userDiscoverability){[弱自我]状态,如果让错误=错误{
打印(错误)
},则
中的错误
开关状态{
case .granted:
self?.discover(完成:完成)
默认值:
print(未授予状态)
}
}
}
私有函数discover(completion:(([[CKUserIdentity]?)-> Void)?){
let op = CKDiscoverAllUserIdentitiesOperation()
op.qualityOfService = .userInitiated
op.discoverAllUserIdentitiesCompletionBlock = {如果让错误=错误{
print(error)
}
}
op.userIdentityDiscoveredBlock = {
中的身份print(identity)
}
op.start()
}
这会导致错误传递给 op.discoverAllUserIdentitiesCompletionBlock
。日志中错误的描述为:
< CKError 0x1c4a51a60:服务器拒绝请求(15/2000);服务器消息=内部服务器错误; uuid = F67453B9-712D-4E5E-9335-929123E3C978; container ID = iCloud.com.huntermaximillionmonk.topdraw>
以前,此操作有效,但仅适用于某些iCloud用户。现在不是我的两个测试用户都一样。
问题:
iOS中的问题 11.0
根据我的测试:
在<在设备(不是模拟器)上的code> Xcode 9.2 / iOS 11.2.1
重置模拟器后首次运行,随后无法运行,但是在设备上可以重复运行。
代码:
让队列= OperationQueue()
func requestPermissions(用于权限:CKApplicationPermissions,
completeHandler:@转义(CKApplicationPermissionStatus,错误?)->()){
CKContainer.default()。requestApplicationPermission(permissions){状态,如果让错误=错误,则
中的错误{
print(请求\(权限)时出错-\(错误))
}
let statusMessage:字符串
切换状态{
case .granted:
statusMessage = Granted
case .denied:
statusMessage = Denied
case .couldNotComplete:
statusMessage =无法完成;
case .initialState:
statusMessage =初始状态;
}
print( Permission-\(statusMessage))
completeHandler(status,error)
}
}
private func discoverAllUsers(){
let operation = CKDiscoverAllUserIdentitiesOperation()
operation.userIdentityDiscoveredBlock = {$ b中的userIdentity
$ b print( userIdentity = \(userIdentity))
}
operation.discoverAllUserIdentitiesCompletionBlock = {
中的错误错误=错误{
print(发现所有用户错误:\(错误)')
}
其他{
print(发现所有用户用户成功完成的操作)
}
}
queue.addOperation(操作)
}
The CKContainer.discoverAllIdentities
request always fails in my CloudKit app. It has continually failed over the course of several days.
A simplified version of the code that is failing (which results in the same error) is:
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()
}
It results in an error being passed to the op.discoverAllUserIdentitiesCompletionBlock
. The description of the error in the log is:
<CKError 0x1c4a51a60: "Server Rejected Request" (15/2000); server message = "Internal server error"; uuid = F67453B9-712D-4E5E-9335-929123E3C978; container ID = "iCloud.com.huntermaximillionmonk.topdraw">
Previously, this operation would work, but only for certain iCloud users. Now it's not for both of my test users.
Problem:
This was a problem in iOS 11.0
Based on my testing:
This works ok in Xcode 9.2
/ iOS 11.2.1
on the device (not simulator)
After resetting the simulator works for the first time, doesn't work subsequently, however on the device it works repeatedly.
Code:
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)
}
这篇关于CKContainer.discoverAllIdentities始终失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!