一.通訊錄開發(fā)
- 1.獲取用戶手機(jī)通訊錄中的聯(lián)系人
- 2.通過獲取通訊錄信息,可以在應(yīng)用中添加好友
二.如何獲取用戶的通訊錄?
- 1.在iOS9之后有兩個框架可以訪問用戶的通訊錄
- ContactsUI
- Contacts
第一種:CotactsUI
首先導(dǎo)入頭文件
import ContactsUI
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// 1.創(chuàng)建聯(lián)系人選擇的控制器
let cpvc = CNContactPickerViewController()
// 2.設(shè)置代理
cpvc.delegate = self
// 3.彈出控制器
present(cpvc, animated: true, completion: nil)
}
}
通過代理方法獲取通訊錄中聯(lián)系人信息
extension ViewController : CNContactPickerDelegate {
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
// 1.獲取用戶的姓名
// lastname --> familyName
// firstname --> givenName
let lastname = contact.familyName
let firstname = contact.givenName
print("姓名:\(firstname) \(lastname)")
// 2.獲取用戶電話號碼(ABMultivalue)
let phones = contact.phoneNumbers
for phone in phones {
let phoneLabel = phone.label
let phoneValue = phone.value.stringValue
print("phoneLabel:\(phoneLabel). phoneValue:\(phoneValue)")
}
}
//這個方法和上面的方法是一樣的,只是它是獲取多個聯(lián)系人的信息
// func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
//
// }
}
//這是運行圖
Demo1.gif
Snip20161119_6.png
第二種:Contacts
Contacts使用步驟:
- 1.獲取用戶的授權(quán)
- 獲取授權(quán)狀態(tài)
- 如果用戶是未決定狀態(tài),則請求授權(quán)
- 2.獲取聯(lián)系人信息
- 判斷授權(quán)狀態(tài)
- 如果是已授權(quán),則獲取聯(lián)系人信息
- 創(chuàng)建通訊錄對象
- 創(chuàng)建聯(lián)系人請求對象
- 遍歷所有聯(lián)系人,獲取聯(lián)系人信息
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//1.獲取授權(quán)狀態(tài)
//CNContactStore 通訊錄對象
let status = CNContactStore.authorizationStatus(for: .contacts)
//2.判斷如果是未決定狀態(tài),則請求授權(quán)
if status == .notDetermined {
//創(chuàng)建通訊錄對象
let store = CNContactStore()
//請求授權(quán)
store.requestAccess(for: .contacts, completionHandler: { (isRight : Bool,error : Error?) in
if isRight {
print("授權(quán)成功")
} else {
print("授權(quán)失敗")
}
})
}
return true
}
獲取聯(lián)系人信息
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//1.獲取授權(quán)狀態(tài)
let status = CNContactStore.authorizationStatus(for: .contacts)
//2.判斷當(dāng)前授權(quán)狀態(tài)
guard status == .authorized else { return }
//3.創(chuàng)建通訊錄對象
let store = CNContactStore()
//4.從通訊錄中獲取所有聯(lián)系人
//獲取Fetch,并且指定之后要獲取聯(lián)系人中的什么屬性
let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey]
//創(chuàng)建請求對象 需要傳入一個(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'類型的數(shù)組
let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
//遍歷所有聯(lián)系人
//需要傳入一個CNContactFetchRequest
do {
try store.enumerateContacts(with: request, usingBlock: {(contact : CNContact, stop : UnsafeMutablePointer<ObjCBool>) -> Void in
//1.獲取姓名
let lastName = contact.familyName
let firstName = contact.givenName
print("姓名 : \(lastName)\(firstName)")
//2.獲取電話號碼
let phoneNumbers = contact.phoneNumbers
for phoneNumber in phoneNumbers
{
print(phoneNumber.label ?? "")
print(phoneNumber.value.stringValue)
}
})
} catch {
print(error)
}
}
}
現(xiàn)在運行一下
Snip20161119_2.png
結(jié)果直接崩了,報錯結(jié)果要在info.plist中配置一個NSContactsUsageDescription 的key
Snip20161119_7.png
Snip20161119_8.png
再運行一下
Demo6.gif
點擊控制器view后
Snip20161119_9.png
再對比虛擬機(jī)的通訊錄
Snip20161119_12.png
兩種方法都介紹了哦