iOS9 新的知識(shí)停巷,應(yīng)該算是代替之前的備受嫌棄的AddressBook framework朵耕,參考https://www.shinobicontrols.com/blog/ios9-day-by-day-day7-contacts-framework棵譬,本文語(yǔ)言Swift2.0嫂侍,工具 Xcode 7.2
開(kāi)始
首先我們要在頭部引入 Contacts 和 ContactsUI 框架
import Contacts
import ContactsUI
然后我們寫一個(gè)方法來(lái)獲取所有的聯(lián)系人信息沾谓,將其放入一個(gè)數(shù)組中
let store = CNContactStore()
CNContactStore 是一個(gè)用來(lái)讀取和保存聯(lián)系人的新的類殴胧,當(dāng)我們有了這個(gè)聯(lián)系人數(shù)據(jù)庫(kù)的引用后渗稍,我們需要?jiǎng)?chuàng)建一個(gè)指定條件的請(qǐng)求,通過(guò)這個(gè)去獲取某些結(jié)果团滥。創(chuàng)建一個(gè) CNContactFetchRequest竿屹,我們可以通過(guò)設(shè)置 contact keys 的數(shù)組,來(lái)獲取我們需要的結(jié)果灸姊。有趣的是拱燃,我們可以通過(guò)CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName) 來(lái)格式化。這是CNContactFormattter的一個(gè)非常方便的方法厨钻,CNContactFormatter 需要很多不同的 keys扼雏,如果不使用 descriptorForRequiredKeysForStyle 方法坚嗜,我們需要手動(dòng)設(shè)置以下的 keys。
[CNContactGivenNameKey, CNContactNamePrefixKey, CNContactNameSuffixKey, CNContactMiddleNameKey, CNContactFamilyNameKey, CNContactTypeKey...]
關(guān)鍵代碼:
let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), CNContactImageDataKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey]
let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)
var contacts = [CNContact]()
do {
try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in
contacts.append(contact)
})
}
catch let error as NSError {
print(error.localizedDescription)
}
return contacts
之后在應(yīng)該的時(shí)候調(diào)用這個(gè)方法诗充,最后根據(jù)獲得的聯(lián)系人數(shù)組苍蔬,可通過(guò)tableView等方式顯示在界面上
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var numberArray: [String] = [String]()
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let contact = self.dataSource![indexPath.row] as CNContact
for number in contact.phoneNumbers {
let phoneNumber = number.value as! CNPhoneNumber
numberArray.append(phoneNumber.stringValue)
}
//拼接一下獲得的號(hào)碼
let numberString = numberArray.joinWithSeparator("/")
cell.textLabel?.text = "\(contact.givenName) \(numberString)"
return cell
}
除此之外蘋果直接給了我們一個(gè)可用的CNContactPickerViewController,通過(guò)它我們可以直接訪問(wèn)系統(tǒng)的通訊錄蝴蜓,讓用戶選擇某個(gè)電話號(hào)碼碟绑,并且保存起來(lái),通過(guò)代理 CNContactPickerDelegate 方法得到用戶選擇的數(shù)據(jù)茎匠。
Demo中我直接在viewController中添加一個(gè)button格仲,按鈕事件為:
@IBAction func action_ToSystemAddressButtonPressed(sender: AnyObject) {
let contactPicker: CNContactPickerViewController = CNContactPickerViewController()
//設(shè)置代理
contactPicker.delegate = self
//添加過(guò)濾條件
contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey, CNContactPhoneticFamilyNameKey]
//添加可選項(xiàng)目的過(guò)濾條件
contactPicker.predicateForEnablingContact = NSPredicate(format: "emailAddresses.@count > 0", argumentArray: nil)
//推出picker
self.presentViewController(contactPicker, animated: true) { () -> Void in
//推送完成后要做的事
}
}
之后我們來(lái)實(shí)現(xiàn)代理方法,一共有五個(gè)可選的代理方法诵冒,其中有兩對(duì)分別用于處理單選和多選凯肋,在Demo中只實(shí)現(xiàn)了其中一個(gè)單選的方法:
func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) {
let contact = contactProperty.contact
let phoneNumber = contactProperty.value as! CNPhoneNumber
//獲取所需的屬性
print(contact.givenName)
print(phoneNumber.stringValue)
}