iOS9通讯录框架Contacts的简单使用
第一步,导入Contacts框架,import Contacts ,这个是不带UI的框架,可以直接获取联系人
// 检查状态
let status: CNAuthorizationStatus = CNContactStore.authorizationStatusForEntityType(CNEntityType.Contacts)
switch status {
case .NotDetermined:
print("是否允许访问联系人,当应用第一次安装在设备上时将处于此状态")
case .Restricted:
print("不能够访问联系人数据,并且用户也不能在设置中改变这个状态")
case .Denied:
print("不允许应用访问联系人数据")
case .Authorized:
print("能够自由访问联系人")
}
第二步,如果没有获取授权就去获取
private func getAuth() {
CNContactStore().requestAccessForEntityType(CNEntityType.Contacts) { (status: Bool, error) in
if error != nil {
print("error = \(error)")
}
// 根据status的状态来判断是否授权成功
print("status = \(status)")
}
}
第三步、获取通讯录信息
// 获取通讯录信息
private func getContactMessage() {
let formatter = CNContactFormatter.descriptorForRequiredKeysForStyle(CNContactFormatterStyle.FullName)
// 这里的 Key 可以根据需要设置
let request = CNContactFetchRequest.init(keysToFetch: [formatter, CNContactIdentifierKey, CNContactPhoneNumbersKey, CNContactEmailAddressesKey, CNContactEmailAddressesKey, CNContactImageDataAvailableKey])
do {
try CNContactStore().enumerateContactsWithFetchRequest(request) {[weak self] (contact: CNContact, status:UnsafeMutablePointer<ObjCBool>) in
// 保存到数组
self!.dataSources.append(contact)
}
} catch let error {
print("获取信息 error = \(error)")
}
}
第四步、打印获取的信息
private func contactMessage() {
for contact in dataSources {
let number = contact.phoneNumbers
// 演示需要,只打印电话号码,这里是一个数组,可能不止一个号码
for obj in number {
let model = obj.value as! CNPhoneNumber
print("number = \(model.stringValue)")
}
}
}
下面介绍包含UI界面的通讯录框架ContactsUI,使用之前要导入import ContactsUI
let contact = CNContactPickerViewController()
contact.delegate = self
// 设置要搜索的信息,可以不设置这个属性
contact.displayedPropertyKeys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactBirthdayKey, CNContactImageDataKey, CNContactPhoneNumbersKey]
// 设置某个搜索的条件,不符合条件的项不可选(搜索号码大于2条的)
let predicate = NSPredicate(format: "[email protected] > 2", argumentArray: nil)
contact.predicateForEnablingContact = predicate
presentViewController(contact, animated: true, completion: nil)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyMycDNxMjM3EzNyUDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
let contact = CNContactPickerViewController()
contact.delegate = self
// 设置要搜索的信息,可以不设置这个属性
contact.displayedPropertyKeys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactBirthdayKey, CNContactImageDataKey, CNContactPhoneNumbersKey]
// 搜索某个属性的条件
let predicateProperty = NSPredicate(format: "(key == 'emailAddresses') AND (value LIKE '*@qq.com')", argumentArray: nil)
contact.predicateForSelectionOfProperty = predicateProperty
presentViewController(contact, animated: true, completion: nil)
下面介绍CNContactPickerDelegate的代理方法
extension ViewController: CNContactPickerDelegate {
func contactPickerDidCancel(picker: CNContactPickerViewController) {
print("点击取消调用")
}
func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) {
print("返回单个CNContact数据的时候调用 = \(contact)")
}
func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) {
print("当搜索条件为 Property 即为属性 predicateForSelectionOfProperty 赋值并且返回的是单个数据的时候调用 = \(contactProperty)")
}
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) {
print("返回一组[CNContact]数据的时候调用 = \(contacts)")
}
func contactPicker(picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty]) {
print("当搜索条件为 Property 即为属性 predicateForSelectionOfProperty 赋值并且返回的是一组数据的时候调用 = \(contactProperties)")
}
}