Swift - 使用Contacts访问通讯录2(添加、修改、删除联系人)
在前文中:Swift - 使用Contacts访问通讯录1(纯代码获取联系人)。我介绍了如何使用 Contacts.framework 框架来获取通讯录里的联系人。本文接着演示如何对通讯录进行新增、修改、删除联系人操作。
(注意:这些操作同查询一样,首先需要发起授权请求。并且在 Info.plist 配置好请求通讯录的相关描述字段。)
运行后打开设备通讯录,可以发现联系人已添加成功。
(注意:这些操作同查询一样,首先需要发起授权请求。并且在 Info.plist 配置好请求通讯录的相关描述字段。)
1,添加新联系人
下面程序启动后,自动往通讯录中新增一个联系人。这里除了设置联系人姓名、电话等基本信息外,还给其添加了个头像。import UIKit import Contacts class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //申请权限 CNContactStore().requestAccess(for: .contacts) { (isRight, error) in if isRight { //授权成功添加数据。 self.addContact() } } } //新增一个联系人 func addContact() { //创建通讯录对象 let store = CNContactStore() //创建CNMutableContact类型的实例 let contactToAdd = CNMutableContact() //设置姓名 contactToAdd.familyName = "张" contactToAdd.givenName = "飞" //设置昵称 contactToAdd.nickname = "fly" //设置头像 let image = UIImage(named: "fei")! contactToAdd.imageData = UIImagePNGRepresentation(image) //设置电话 let mobileNumber = CNPhoneNumber(stringValue: "18510002000") let mobileValue = CNLabeledValue(label: CNLabelPhoneNumberMobile, value: mobileNumber) contactToAdd.phoneNumbers = [mobileValue] //设置email let email = CNLabeledValue(label: CNLabelHome, value: "feifei@163.com" as NSString) contactToAdd.emailAddresses = [email] //添加联系人请求 let saveRequest = CNSaveRequest() saveRequest.add(contactToAdd, toContainerWithIdentifier: nil) do { //写入联系人 try store.execute(saveRequest) print("保存成功!") } catch { print(error) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }


2,编辑修改联系人
先获取所有联系人并进行遍历,根据联系人姓名或者电话来判断是否要修改。这里我们将“张飞”的昵称修改成“小飞飞”。import UIKit import Contacts class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //申请权限 CNContactStore().requestAccess(for: .contacts) { (isRight, error) in if isRight { //授权成功修改数据。 self.editContact() } } } func editContact() { //创建通讯录对象 let store = CNContactStore() //获取Fetch,并且指定要获取联系人中的什么属性 let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactNicknameKey] //创建请求对象,需要传入一个(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'类型的数组 let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor]) //遍历所有联系人 do { try store.enumerateContacts(with: request, usingBlock: { (contact : CNContact, stop : UnsafeMutablePointer<ObjCBool>) -> Void in let mutableContact = contact.mutableCopy() as! CNMutableContact //获取姓名 let lastName = mutableContact.familyName let firstName = mutableContact.givenName //判断是否符合要求 if lastName == "张" && firstName == "飞"{ //设置昵称 mutableContact.nickname = "小飞飞" //修改联系人请求 let request = CNSaveRequest() request.update(mutableContact) do { //修改联系人 try store.execute(request) print("修改成功!") } catch { print(error) } } }) } catch { print(error) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
3,删除联系人
同样先获取所有联系人并进行遍历,根据联系人姓名或者电话来判断是否要删除。这里我们将“张飞”这个联系人删除。import UIKit import Contacts class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //申请权限 CNContactStore().requestAccess(for: .contacts) { (isRight, error) in if isRight { //授权成功删除数据。 self.deleteContact() } } } func deleteContact() { //创建通讯录对象 let store = CNContactStore() //获取Fetch,并且指定要获取联系人中的什么属性 let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactNicknameKey] //创建请求对象,需要传入一个(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'类型的数组 let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor]) //遍历所有联系人 do { try store.enumerateContacts(with: request, usingBlock: { (contact : CNContact, stop : UnsafeMutablePointer<ObjCBool>) -> Void in let mutableContact = contact.mutableCopy() as! CNMutableContact //获取姓名 let lastName = mutableContact.familyName let firstName = mutableContact.givenName //判断是否符合要求 if lastName == "张" && firstName == "飞"{ //删除联系人请求 let request = CNSaveRequest() request.delete(mutableContact) do { //执行操作 try store.execute(request) print("删除成功!") } catch { print(error) } } }) } catch { print(error) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }