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()
}
}
