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
相关产品推荐
相关产品推荐

