CKContainer.discoverAllIdentities始终失败 [英] CKContainer.discoverAllIdentities always fails

查看:116
本文介绍了CKContainer.discoverAllIdentities始终失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆