天天看点

iOS9通讯录框架Contacts的简单使用

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)
           
iOS9通讯录框架Contacts的简单使用
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)
           
iOS9通讯录框架Contacts的简单使用

下面介绍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)")
    }
}