iOS 18中如何用CNContactPickerViewController实现有限联系人选择器?
iOS 18有限联系人访问下的CNContactPickerViewController适配
问题答案
可以。iOS 18中,当用户授予有限联系人访问权限时,CNContactPickerViewController会自动仅展示用户在权限界面选中的联系人,无需手动实现筛选逻辑。你只需调整现有代码的分支判断,统一触发选择器的逻辑即可。
代码调整步骤
- 简化授权后的分支逻辑
原来的代码在iOS 18的.limited权限分支留了注释占位,现在可以直接调用选择器初始化方法——系统会自动处理有限联系人的过滤。 - 统一选择器呈现逻辑
不管是.authorized还是.limited权限,只要授权通过,都直接调用presentContactPickerViewController,iOS 18会根据当前权限自动适配显示内容。
修改后的完整代码
@IBAction func addContactBtnEvent(_ sender: Any) { PermissionsService.shared.requestContactsAccess { [weak self] isGranted in DispatchQueue.main.async { guard let self = self else { return } if isGranted { // iOS 18及以上会根据权限自动过滤有限联系人,无需额外处理 self.presentContactPickerViewController() } else { self.showContactSettingsAlert() } } } } func requestContactsAccess(completion: @escaping (_ granted: Bool) -> Void) { let contactStore = CNContactStore() let authorizationStatus = CNContactStore.authorizationStatus(for: .contacts) switch authorizationStatus { case .authorized, .limited: completion(true) case .denied, .restricted: completion(false) case .notDetermined: contactStore.requestAccess(for: .contacts) { granted, error in completion(granted) } @unknown default: fatalError() } } func presentContactPickerViewController() { let contactPicker = CNContactPickerViewController() contactPicker.delegate = self contactPicker.predicateForEnablingContact = NSPredicate(format: "%K.@count > 0", CNContactPhoneNumbersKey) self.present(contactPicker, animated: true, completion: nil) }
关键说明
- 当权限为
.limited时,iOS 18的CNContactPickerViewController会自动加载用户授权的有限联系人列表,无需手动通过CNContactStore查询后再构建自定义选择器。 - iOS 18以下版本没有有限联系人访问权限,逻辑保持原有流程即可,不会受到影响。
内容的提问来源于stack exchange,提问作者Jay Bhalani
相关产品推荐
相关产品推荐

