1、地址薄
地址薄是一个数据库,里面存储了联系人的相关信息。实现访问地址薄有两种框架:AddressBook.framework没有界面,通过代码获取联系人信息、AddressBookUI.framework通过系统地址薄交互界面来访问。
1)代码访问地址薄
1 //代码获取地址薄 2 @IBAction func codeToAddressButtonClick() 3 { 4 //首先定义一个Unmanaged<CFError>错误标记对象,可以通过该对象来判断是否成功 5 var error:Unmanaged<CFError>? 6 7 //通过ABAddressBookCreateWithOptions方法创建一个address Book对象,来获取电话簿句柄 8 let addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() 9 10 //发出授权信息 11 let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus() 12 13 // 14 if sysAddressBookStatus == .Denied || sysAddressBookStatus == .NotDetermined { 15 // Need to ask for authorization 16 let authorizedSingal:dispatch_semaphore_t = dispatch_semaphore_create(0) 17 let askAuthorization:ABAddressBookRequestAccessCompletionHandler = { success, error in 18 if success { 19 ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 20 dispatch_semaphore_signal(authorizedSingal) 21 } 22 } 23 ABAddressBookRequestAccessWithCompletion(addressBook, askAuthorization) 24 dispatch_semaphore_wait(authorizedSingal, DISPATCH_TIME_FOREVER) 25 } 26 27 28 let listContacts:NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 29 30 //调用analyzeSysContacts方法 31 analyzeSysContacts(listContacts) 32 }
//代码获取地址薄 func analyzeSysContacts(sysContacts:NSArray) { for contact in sysContacts { /* 部分单值属性 */ // 姓 let firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? "" print("姓:(firstName)") // 名 let lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? "" print("名:(lastName)") // 昵称 let nikename = ABRecordCopyValue(contact, kABPersonNicknameProperty)?.takeRetainedValue() as! String? ?? "" print("昵称:(nikename)") // 公司(组织) let organization = ABRecordCopyValue(contact, kABPersonOrganizationProperty)?.takeRetainedValue() as! String? ?? "" print("公司(组织):(organization)") // 职位 let jobTitle = ABRecordCopyValue(contact, kABPersonJobTitleProperty)?.takeRetainedValue() as! String? ?? "" print("职位:(jobTitle)") // 部门 let department = ABRecordCopyValue(contact, kABPersonDepartmentProperty)?.takeRetainedValue() as! String? ?? "" print("部门:(department)") //备注 let note = ABRecordCopyValue(contact, kABPersonNoteProperty)?.takeRetainedValue() as! String? ?? "" print("备注:(note)") /* 部分多值属性 */ // 电话 let propertyValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonPhoneProperty)?.takeRetainedValue() if propertyValues != nil { for i in 0 ..< ABMultiValueGetCount(propertyValues) { //获取电话类型:(比如 工作,住宅,iphone,移动电话等) var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(propertyValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(propertyValues, i) let phone = value.takeRetainedValue() as? String ?? "" print("(label):(phone)"); } } // E-mail let emailValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonEmailProperty)?.takeRetainedValue() if emailValues != nil { for i in 0 ..< ABMultiValueGetCount(emailValues) { //获取邮箱类型 var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(emailValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(emailValues, i) let email = value.takeRetainedValue() as? String ?? "" print("(label):(email)"); } } // 地址 let addressValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonAddressProperty)?.takeRetainedValue() if addressValues != nil { for i in 0 ..< ABMultiValueGetCount(addressValues) { //获取地址类型 var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(addressValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(addressValues, i) let addrNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary let _Country = addrNSDict.valueForKey(kABPersonAddressCountryKey as String) as? String ?? "" let _State = addrNSDict.valueForKey(kABPersonAddressStateKey as String) as? String ?? "" let _City = addrNSDict.valueForKey(kABPersonAddressCityKey as String) as? String ?? "" let _Street = addrNSDict.valueForKey(kABPersonAddressStreetKey as String) as? String ?? "" let _Contrycode = addrNSDict.valueForKey(kABPersonAddressCountryCodeKey as String) as? String ?? "" print("(label)==_Country:(_Country) _State:(_State) _City:(_City) _Street:(_Street) _Contrycode:(_Contrycode)"); } } // 纪念日 let dateValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonDateProperty)?.takeRetainedValue() if dateValues != nil { for i in 0 ..< ABMultiValueGetCount(dateValues) { //获取纪念日类型 var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(dateValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(dateValues, i) let date = (value.takeRetainedValue() as? NSDate)?.description print("(label):(date)"); } } // URL let urlValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonURLProperty)?.takeRetainedValue() if urlValues != nil { for i in 0 ..< ABMultiValueGetCount(urlValues) { //获取URL类型 var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(urlValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(urlValues, i) let url = value.takeRetainedValue() as? String ?? "" print("(label):(url)"); } } // SNS let snsValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonSocialProfileProperty)?.takeRetainedValue() if snsValues != nil { for i in 0 ..< ABMultiValueGetCount(snsValues) { //获取SNS类型 var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(snsValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(snsValues, i) let snsNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary let _Username = snsNSDict.valueForKey(kABPersonSocialProfileUsernameKey as String) as? String ?? "" let _URL = snsNSDict.valueForKey(kABPersonSocialProfileURLKey as String) as? String ?? "" let _Serves = snsNSDict.valueForKey(kABPersonSocialProfileServiceKey as String) as? String ?? "" print("(label)==_Username:(_Username) _URL:(_URL) _Serves:(_Serves)"); } } // IM let imValues:ABMultiValueRef? = ABRecordCopyValue(contact, kABPersonInstantMessageProperty)?.takeRetainedValue() if imValues != nil { for i in 0 ..< ABMultiValueGetCount(imValues) { //获取IM类型 var label = "" if let leixin = ABMultiValueCopyLabelAtIndex(imValues,i) { label = leixin.takeRetainedValue() as String } let value = ABMultiValueCopyValueAtIndex(imValues, i) let imNSDict:NSMutableDictionary = value.takeRetainedValue() as! NSMutableDictionary let _Serves = imNSDict.valueForKey(kABPersonInstantMessageServiceKey as String) as? String ?? "" let _Username = imNSDict.valueForKey(kABPersonInstantMessageUsernameKey as String) as? String ?? "" print("(label)==_Serves:(_Serves) _Username:(_Username)"); } } } }
新增联系人:
1 //新增联系人 2 @IBAction func addPeople () 3 { 4 //取得电话薄句柄 5 var error:Unmanaged<CFError>? 6 let addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() 7 8 //创建一个联系人对象 9 let newContact:ABRecordRef! = ABPersonCreate().takeRetainedValue() 10 var success:Bool = false 11 12 //昵称 13 success = ABRecordSetValue(newContact, kABPersonNicknameProperty, "Gaven", &error) 14 print("设置昵称是否成功: (success)") 15 16 //设置姓 17 success = ABRecordSetValue(newContact, kABPersonFirstNameProperty, "zhang", &error) 18 print("设置姓是否成功: (success)") 19 20 //设置名 21 success = ABRecordSetValue(newContact, kABPersonLastNameProperty, "wu", &error) 22 print("设置名是否成功:(success)") 23 24 //设置电话 25 let tmpMutableMultiPhones:ABMutableMultiValue = ABMultiValueCreateMutable( 26 ABPropertyType(kABStringPropertyType)).takeRetainedValue() 27 28 success = ABMultiValueAddValueAndLabel(tmpMutableMultiPhones, "15901234000", "companyPhone", nil); 29 print("设置电话标题是否成功:(success)") 30 31 success = ABRecordSetValue(newContact, kABPersonPhoneProperty, tmpMutableMultiPhones, nil) 32 print("设置电话是否成功:(success)") 33 34 //设置邮箱 35 let addr:ABMutableMultiValue = ABMultiValueCreateMutable( 36 ABPropertyType(kABStringPropertyType)).takeRetainedValue() 37 ABMultiValueAddValueAndLabel(addr, "185@leadingdo.com", "companyEmail", nil) 38 print("设置邮箱标题是否成功:(success)") 39 40 ABRecordSetValue(newContact, kABPersonEmailProperty, addr, nil) 41 print("设置邮箱是否成功:(success)") 42 43 //保存记录 44 success = ABAddressBookAddRecord(addressBook, newContact, &error) 45 print("保存记录是否成功:? (success)") 46 47 //保存数据库 48 success = ABAddressBookSave(addressBook, &error) 49 print("修改数据库是否成功: (success)") 50 }
删除联系人:
1 //删除联系人 2 @IBAction func deletePeople() 3 { 4 //定义错误标记 5 var error:Unmanaged<CFError>? 6 7 //取得电话薄句柄 8 let addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() 9 10 //读取通讯录 11 let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus() 12 13 if sysAddressBookStatus == .Denied || sysAddressBookStatus == .NotDetermined { 14 // Need to ask for authorization 15 let authorizedSingal:dispatch_semaphore_t = dispatch_semaphore_create(0) 16 let askAuthorization:ABAddressBookRequestAccessCompletionHandler = { success, error in 17 if success { 18 ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 19 dispatch_semaphore_signal(authorizedSingal) 20 } 21 } 22 ABAddressBookRequestAccessWithCompletion(addressBook, askAuthorization) 23 dispatch_semaphore_wait(authorizedSingal, DISPATCH_TIME_FOREVER) 24 } 25 26 let sysContacts:NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 27 28 29 //遍历通讯录 30 for contact in sysContacts { 31 32 // 姓 33 let firstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? "" 34 35 36 print("姓:(firstName)") 37 38 // 名 39 let lastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? "" 40 41 42 print("名:(lastName)") 43 44 var success:Bool = false 45 46 if firstName == "zhang" && lastName == "wu" 47 { 48 success = ABAddressBookRemoveRecord(addressBook, contact, nil); 49 print("删除是否成功: (success)") 50 } 51 52 //保存数据库 53 success = ABAddressBookSave(addressBook, &error) 54 print("修改数据库是否成功: (success)") 55 } 56 }
2)界面打开地址薄
//UI打开地址薄 @IBAction func uiToAddressButtonClick() { let picker = ABPeoplePickerNavigationController() picker.peoplePickerDelegate = self self.presentViewController(picker, animated: true, completion: { () -> Void in }) }
代理方法:
1 // MARK: - ABPeoplePickerNavigationControllerDelegate 2 func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord) 3 { 4 // 姓 5 let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as! String? ?? "" 6 7 print("选中人的姓:(firstName)") 8 9 10 // 名 11 let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty)?.takeRetainedValue() as! String? ?? "" 12 13 print("选中人的名:(lastName)") 14 } 15 16 func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier) 17 { 18 19 20 } 21 22 func peoplePickerNavigationControllerDidCancel(peoplePicker: ABPeoplePickerNavigationController) 23 { 24 //取消 25 peoplePicker.dismissViewControllerAnimated(true, completion: { () -> Void in 26 27 }) 28 } 29 30 func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, shouldContinueAfterSelectingPerson person: ABRecord) -> Bool 31 { 32 return true 33 } 34 35 func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, shouldContinueAfterSelectingPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier) -> Bool 36 { 37 return true 38 }
2、短信、电话、邮件
引入框架MessageUI.framework,实现UINavigationControllerDelegate,MFMessageComposeViewControllerDelegate。
1)短信
1 //发短信 2 // 添加MessageUI.framework框架 3 // 4 // 为ViewController类 5 // 添加UINavigationControllerDelegate, MFMessageComposeViewControllerDelegate 接口 6 // 实现func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) 7 @IBAction func sendSMSButtonClick() 8 { 9 //判断 10 if MFMessageComposeViewController.canSendText(){ 11 let controller = MFMessageComposeViewController() 12 13 // 设置短信内容 14 controller.body = "短信内容短信内容" 15 16 // 设置收件人列表 17 controller.recipients = ["15900001111,18900001111,17011112222"] 18 19 //设置代理 20 controller.messageComposeDelegate = self 21 22 //打开界面 23 self.presentViewController(controller, animated: true, completion: nil) 24 } else { 25 let alert = UIAlertView(title: "提示信息", message: "本设备不能发短信", delegate: nil, cancelButtonTitle: "确定") 26 alert.show() 27 } 28 }
1 //代理 2 func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) 3 { 4 controller.dismissViewControllerAnimated(true, completion: nil) 5 6 switch result.rawValue{ 7 8 case MessageComposeResultSent.rawValue: 9 print("短信已发送") 10 case MessageComposeResultCancelled.rawValue: 11 print("短信已取消") 12 case MessageComposeResultFailed.rawValue: 13 print("短信发送失败") 14 default: 15 break 16 } 17 }
2)拨打电话
//打电话 @IBAction func phoneButtonClick() { //调用打电话功能--最简单最直接的方式:直接跳到拨号界面 UIApplication.sharedApplication().openURL(NSURL(string: "tel://10086")!) }
3)发邮件
1 //发邮件 2 @IBAction func sendEmailButtonClick() 3 { 4 if MFMailComposeViewController.canSendMail() 5 { 6 let picker = MFMailComposeViewController() 7 picker.mailComposeDelegate = self 8 9 //设置主题 10 picker.setSubject("这是一个主题") 11 12 //设置发件人 13 picker.setToRecipients(["1@leadingdo.com","2@leadingdo.com","3@leadingdo.com"]) 14 15 //设置抄送人 16 picker.setCcRecipients(["cc1@leadingdo.com","cc2@leadingdo.com"]) 17 18 //设置密送人 19 picker.setBccRecipients(["bcc@leadingdo.com"]) 20 21 //添加图片附件 22 let path = NSBundle.mainBundle().pathForResource("SwiftClassWeiXin.png", ofType: "") 23 let myData = NSData(contentsOfFile: path!) 24 picker.addAttachmentData(myData!, mimeType: "image/png", fileName: "swift.png") 25 26 //设置邮件正文内容-支持html 27 picker.setMessageBody("这是邮件正文", isHTML: false) 28 29 //打开界面 30 self.presentViewController(picker, animated: true, completion: nil) 31 } 32 else 33 { 34 let alert = UIAlertView(title: "提示信息", message: "本设备不能发邮件", delegate: nil, cancelButtonTitle: "确定") 35 alert.show() 36 } 37 }
1 //发送邮件代理方法 2 func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) 3 { 4 controller.dismissViewControllerAnimated(true, completion: nil) 5 6 switch result.rawValue{ 7 case MFMailComposeResultCancelled.rawValue: 8 print("邮件已取消") 9 break; 10 case MFMailComposeResultSaved.rawValue: 11 print("邮件已保存") 12 break; 13 case MFMailComposeResultSent.rawValue: 14 print("邮件已发送") 15 break; 16 case MFMailComposeResultFailed.rawValue: 17 print("邮件发送失败") 18 break; 19 default: 20 print("邮件没有发送") 21 break; 22 } 23 }