一.通讯录开发
- 1.获取用户手机通讯录中的联系人
- 2.通过获取通讯录信息,可以在应用中添加好友
二.如何获取用户的通讯录?
- 1.在iOS9之后有两个框架可以访问用户的通讯录
- ContactsUI
- Contacts
第一种:CotactsUI
首先导入头文件
import ContactsUI
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// 1.创建联系人选择的控制器
let cpvc = CNContactPickerViewController()
// 2.设置代理
cpvc.delegate = self
// 3.弹出控制器
present(cpvc, animated: true, completion: nil)
}
}
通过代理方法获取通讯录中联系人信息
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)")
}
}
//这个方法和上面的方法是一样的,只是它是获取多个联系人的信息
// func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
//
// }
}
//这是运行图
第二种:Contacts
Contacts使用步骤:
- 1.获取用户的授权
- 获取授权状态
- 如果用户是未决定状态,则请求授权
- 2.获取联系人信息
- 判断授权状态
- 如果是已授权,则获取联系人信息
- 创建通讯录对象
- 创建联系人请求对象
- 遍历所有联系人,获取联系人信息
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//1.获取授权状态
//CNContactStore 通讯录对象
let status = CNContactStore.authorizationStatus(for: .contacts)
//2.判断如果是未决定状态,则请求授权
if status == .notDetermined {
//创建通讯录对象
let store = CNContactStore()
//请求授权
store.requestAccess(for: .contacts, completionHandler: { (isRight : Bool,error : Error?) in
if isRight {
print("授权成功")
} else {
print("授权失败")
}
})
}
return true
}
获取联系人信息
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//1.获取授权状态
let status = CNContactStore.authorizationStatus(for: .contacts)
//2.判断当前授权状态
guard status == .authorized else { return }
//3.创建通讯录对象
let store = CNContactStore()
//4.从通讯录中获取所有联系人
//获取Fetch,并且指定之后要获取联系人中的什么属性
let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey]
//创建请求对象 需要传入一个(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'类型的数组
let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
//遍历所有联系人
//需要传入一个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)
}
}
}
现在运行一下
结果直接崩了,报错结果要在info.plist中配置一个NSContactsUsageDescription 的key
再运行一下
点击控制器view后
再对比虚拟机的通讯录
两种方法都介绍了哦