You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS17中CloudKit获取用户姓名:替代弃用的userDiscoverability方案

问题:iOS 17中CloudKit userDiscoverability弃用后获取当前用户姓名的替代方案

我尝试从CloudKit中获取当前用户的姓名,但Xcode提示userDiscoverability特性将在iOS 17.0中被弃用,该特性不再受支持,需改用「与其他iCloud用户共享CloudKit数据」特性。

此前使用的函数:

func fetchUserName(completion: @escaping ( _ fullName:String, _ success:Bool) -> Void) {
    container.requestApplicationPermission(.userDiscoverability) { (status, error) in
        self.container.fetchUserRecordID { (record, error) in
            self.container.discoverUserIdentity(withUserRecordID: record!) { (userID, error) in
                var name: String = ""
    
                self.container.accountStatus { accountStatus, error in
                    if let error = error {
                        print(error.localizedDescription)
                    }
                    
                }

                guard let givenName = userID?.nameComponents?.givenName,
                      let familyName = userID?.nameComponents?.familyName else {
                    completion("", false)
                    print("Unable to fetch user name")
                    return
                }
                
                let fullName: String = givenName + " " + familyName
                name = fullName

                DispatchQueue.main.async {
                    completion(name, true)
                }
            }
        }
    }
}

解决方案

  • iOS 17及以后版本,获取当前用户姓名需使用CKUserIdentityLookupInfo结合discoverUserIdentities方法,无需再请求userDiscoverability权限,但要确保项目开启「iCloud云共享」能力。

  • 替代实现代码:

func fetchCurrentUserName(completion: @escaping (String?, Bool) -> Void) {
    container.fetchUserRecordID { [weak self] recordID, error in
        guard let self = self, let recordID = recordID else {
            completion(nil, false)
            return
        }
        
        let lookupInfo = CKUserIdentityLookupInfo(userRecordID: recordID)
        
        self.container.discoverUserIdentities(with: [lookupInfo]) { identities, error in
            if let error = error {
                print("查询用户信息失败: \(error.localizedDescription)")
                completion(nil, false)
                return
            }
            
            guard let identity = identities?.first,
                  let givenName = identity.nameComponents?.givenName,
                  let familyName = identity.nameComponents?.familyName else {
                completion(nil, false)
                return
            }
            
            let fullName = "\(givenName) \(familyName)"
            DispatchQueue.main.async {
                completion(fullName, true)
            }
        }
    }
}
  • 额外注意事项:
    • 确保项目的「Signing & Capabilities」中已添加「iCloud」能力,并勾选「CloudKit」和「CloudKit Sharing」选项。
    • 移除原代码中requestApplicationPermission(.userDiscoverability)的调用,该权限在iOS 17已失效。
    • 异步回调中使用weak self避免循环引用。

内容的提问来源于stack exchange,提问作者ChickenRei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:20:07