Cloudkit 身份验证仅适用于我的 alt 帐户,不适用于 Dev 或 Tester 帐户

Posted

技术标签:

【中文标题】Cloudkit 身份验证仅适用于我的 alt 帐户,不适用于 Dev 或 Tester 帐户【英文标题】:Cloudkit Authentication Only works on my alt account and not Dev or Tester accounts 【发布时间】:2020-10-07 19:33:31 【问题描述】:

我注意到,在模拟器或物理设备中测试我的 cloudkit 应用程序时,我只能使用我的 alt 帐户而不是我用来制作应用程序/容器的 dev 帐户保存记录。当我去保存时,我得到了错误:

错误保存记录 到服务器:没有创建操作 允许

运行时具体错误码为10

if let error = error as? CKError  print(error.errorCode) 

这表示权限问题。 cloudkit 仪表板中的所有安全角色都是正确的。我确认用户在所有帐户上都通过了 cloudkit 的身份验证

CKContainer.default().accountStatus  (accountStatus, error) in
        switch accountStatus 
        case .available:
            print("iCloud Available")
        case .noAccount:
            print("No iCloud account")
        case .restricted:
            print("iCloud restricted")
        case .couldNotDetermine:
            print("Unable to determine iCloud status")
        
    

它在 Apple Reviewer 端也不起作用,他们已经因为这个错误拒绝了我的应用程序。这意味着它不仅是我的开发帐户不起作用,它似乎是除了我的 alt 之外的所有东西。这看起来很奇怪。

这是我的存档代码:

static func saveUser(user: UserElement, completion: @escaping (Result<UserElement, Error>) ->
    ()) 
    let itemRecord = CKRecord(recordType: "userInfo")
    
    itemRecord["uniqueID"] = user.bossID as CKRecordValue
    itemRecord["screenName"] = user.screenName as CKRecordValue
    itemRecord["shareCode"] = user.shareCode as CKRecordValue
    itemRecord["subscribedBosses"] = user.subscribedBosses as CKRecordValue

    let container = CKContainer(identifier: "iCloud.Caz4Short.WatChaDoin")
    container.publicCloudDatabase.save(itemRecord)  (record, err) in
        DispatchQueue.main.async 
            if let err = err 
                print("error on run")
                completion(.failure(err))
                return
            
            
            guard let record = record else 
                print("record")
                completion(.failure(CloudKitHelperError.recordFailure))
                return
            
            
            let id = record.recordID
            guard let boss = record["uniqueID"] as? String else 
                print("record ID")
                completion(.failure(CloudKitHelperError.recordIDFailure))
                return
            
            guard let name = record["screenName"] as? String else 
                
                print("screenname")
                completion(.failure(CloudKitHelperError.castFailure))
                return
            
            guard let bossCode = record["shareCode"] as? String else 
                print("Code")
                completion(.failure(CloudKitHelperError.castFailure))
                return
            
            guard let subs = record["subscribedBosses"] as? [String] else 
                completion(.failure(CloudKitHelperError.castFailure))
                return
            
            let element = UserElement(recordID: id, bossID: boss, screenName: name, shareCode: bossCode, subscribedBosses: subs)
            completion(.success(element))
        
    

【问题讨论】:

您的容器(在您的 let container =... 行中)是默认容器还是其他容器?也许是一个共享容器,而您没有共享访问权限?一种理论是“let container = CKContainer.default()”会很好(看看我所做的并且没有问题)...... 是的,这是默认且唯一的容器。实际上,我只是切换了指定容器,认为默认容器是问题所在,但这两种方式都不起作用。 【参考方案1】:

这是 CloudKit 的一个错误。有时容器显然会在创建时被破坏。

我能够通过在 Xcode 中创建一个新容器(在您的应用程序的配置屏幕上)并取消选中旧容器来修复它。然后我从头开始配置新容器,添加所有数据类型并配置安全角色(角色需要 5 分钟才能启动,所以请继续检查/尝试)。

【讨论】:

以上是关于Cloudkit 身份验证仅适用于我的 alt 帐户,不适用于 Dev 或 Tester 帐户的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 用户身份验证与单点登录

Apache LDAP 身份验证仅适用于某些虚拟主机

在 web.config 中设置具有身份验证的代理以访问 Internet

cloudKit:CKSubscription 错误“此请求需要经过身份验证的帐户””

无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

Android Autofill 仅适用于来自 onFillRequest 而不是来自身份验证活动的响应