我目前在 Swift 应用程序中使用
CNContactPickerViewController
来允许用户选择联系人。随着 iOS 18 新功能的有限联系人访问权限的引入,我想修改我的实现,以便仅显示用户在有限联系人访问权限屏幕中选择的联系人。
一旦用户在 iOS 18 中授予有限联系人访问权限,是否有办法在 CNContactPickerViewController 中仅显示有限联系人?如果是这样,我需要在 Swift 代码中进行哪些调整才能支持这一点?
这是我当前用于联系人选择器的 Swift 代码:
@IBAction func addContactBtnEvent(_ sender: Any) {
PermissionsService.shared.requestContactsAccess { [weak self] isGranded in
DispatchQueue.main.async {
if isGranded {
if #available(iOS 18.0, *) {
if CNContactStore.authorizationStatus(for: .contacts) == .limited {
// Fetch limited access contacts
}
} else {
// Fallback on earlier versions
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:
completion(true)
case .denied, .restricted:
completion(false)
case .limited:
completion(true)
case .notDetermined:
contactStore.requestAccess(for: .contacts) { granted, error in
if granted {
completion(true)
} else {
completion(false)
}
}
@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)
}
CNContactPickerViewController
和限制联系人访问是允许用户限制应用程序对其联系人的访问的两种相关但独立的方式。
CNContactPickerViewController
允许应用程序提供对选定联系人的一次性访问。 您的应用程序不需要请求联系人访问权限即可使用它。
有限的联系人访问权限使您的应用程序可以持续访问一组选定的联系人。 这为用户提供了比“完全联系人访问”权限更多的控制权,“完全联系人访问”权限授予应用程序对所有当前和未来联系人的持续访问权限;比用户想要的更广泛的权限。
如果您确实需要持续访问一组联系人并希望用户选择其中一个联系人,那么您将需要构建自己的选择屏幕。