地址薄、短信、电话、邮件

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     }
原文地址:https://www.cnblogs.com/fengmin/p/5718757.html