Swift iOS 9通讯录访问
来源:互联网 发布:龙门式数控切割机 编程 编辑:程序博客网 时间:2024/05/29 19:14
原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:在iOS 9之前,一直使用AddressBook这个framework来访问用户通讯录。但是在iOS 9中,AddressBook被废弃了,转而使用Contacts Framework。
文档
- Contacts Framework
- Contacts UI Framework
Demo效果
下载链接
请求访问权限
相关类
CNContactStore(线程安全)
CNContactStore代表了实际设备上存储,通过这个类可以
- 检查当前的通讯录访问权限
- 请求访问通讯录权限
- fetch通讯录内容(支持按条件fetch,和core data 类似)
- 保存到通讯录
CNContact(线程安全)
表示通讯录中一位联系人的Model类,和NSDictionary类似,他有一个子类是可变的CNMutableContact
示例代码
保存一个store对象,Demo中采用单例
注意,Swift中单例这么写是线程安全的
class ContactsStore{ static let sharedStore = CNContactStore()}
请求权限
let authStatus = CNContactStore.authorizationStatusForEntityType(CNEntityType.Contacts) let authStatus = ContactsStore.sharedStore.authorizationStatusForEntityType(CNEntityType.Contacts) if authStatus == CNAuthorizationStatus.Denied || authStatus == CNAuthorizationStatus.NotDetermined{ self.contactsStore.requestAccessForEntityType(CNEntityType.Contacts, completionHandler: { (result, error) -> Void in if result == false{ let alert = UIAlertController(title: "警告", message: "请在设置中允许通讯录访问,否则App无法正常使用", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Cancel , handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } }) }
调用系统的ContactsPickerViewController
- 让ViewController实现CNContactPickerDelegate协议
实现如下方法,处理选中的结果
func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) { if let phoneNumber = contact.phoneNumbers.first?.value as? CNPhoneNumber{ self.textfield.text = phoneNumber.stringValue } }
然后,模态展示
let contactsVC = CNContactPickerViewController() contactsVC.delegate = self; presentViewController(contactsVC, animated:true, completion: nil)
查询全部通讯录
注意,要先指明需要fetch的属性,
因为enumerateContactsWithFetchRequest
这个函数会抛出异常,所以要用do-try-catch包括起来
let keys = [CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactThumbnailImageDataKey] let fetchAllRequest = CNContactFetchRequest(keysToFetch:keys) do{ try ContactsStore.sharedStore.enumerateContactsWithFetchRequest(fetchAllRequest) { (contact, pointer) -> Void in self.contacts.append(contact) } }catch{ }
条件查询
条件查询在示例工程中未列出,按照如下步骤查询
使用如下CNContact方法创建NSPredicate对象
+ predicateForContactsMatchingName:+ predicateForContactsWithIdentifiers:...
使用CNContactStore的
来查询
- unifiedContactsMatchingPredicate:keysToFetch:error:
添加
摘自Swift2.1文档
import Contacts// Creating a mutable object to add to the contactlet contact = CNMutableContact()contact.imageData = NSData() // The profile picture as a NSData objectcontact.givenName = "John"contact.familyName = "Appleseed"let homeEmail = CNLabeledValue(label:CNLabelHome, value:"john@example.com")let workEmail = CNLabeledValue(label:CNLabelWork, value:"j.appleseed@icloud.com")contact.emailAddresses = [homeEmail, workEmail]contact.phoneNumbers = [CNLabeledValue( label:CNLabelPhoneNumberiPhone, value:CNPhoneNumber(stringValue:"(408) 555-0126"))]let homeAddress = CNMutablePostalAddress()homeAddress.street = "1 Infinite Loop"homeAddress.city = "Cupertino"homeAddress.state = "CA"homeAddress.postalCode = "95014"contact.postalAddresses = [CNLabeledValue(label:CNLabelHome, value:homeAddress)]let birthday = NSDateComponents()birthday.day = 1birthday.month = 4birthday.year = 1988 // You can omit the year value for a yearless birthdaycontact.birthday = birthday// Saving the newly created contactlet store = CNContactStore()let saveRequest = CNSaveRequest()saveRequest.addContact(contact, toContainerWithIdentifier:nil)try store.executeSaveRequest(saveRequest)
本地化/格式化
几个常用的类
- CNContactFormatter
- CNPostalAddressFormatter
- CNContact.localizedStringForKey
- CNLabeledValue.localizedStringForLabel
举例
从Contact中拼接出全名
let fullName = CNContactFormatter.stringFromContact(contact, style: .FullName)print(fullName)// John Appleseed
邮政地址
let postalString = CNPostalAddressFormatter.stringFromPostalAddress(homeAddress)print(postalString)// 1 Infinite Loop// Cupertino// CA// 95014
对通讯录的内置Key获取
let displayName = CNContact.localizedStringForKey(CNContactNicknameKey)print(displayName)// 昵称,在中文条件下
最后
欢迎关注我的CSDN博客,在我每个月都会更新10篇左右的iOS 文章,源码都是Swift的。
- Swift iOS 9通讯录访问
- IOS/Swift 通讯录步骤
- iOS 访问通讯录
- IOS---访问通讯录
- IOS如何访问通讯录
- iOS 访问通讯录
- iOS 访问通讯录
- iOS -- 访问通讯录
- ios 访问通讯录
- IOS访问通讯录
- IOS如何访问通讯录
- iOS 访问通讯录
- iOS访问通讯录
- ios 通讯录访问权限
- iOS 访问手机通讯录
- iOS 通讯录访问(一)
- iOS 通讯录访问(二)
- ios中访问通讯录数据
- go的学习资料点评
- Android 欢迎引导页的魅力
- 为何web.xml中的welcome-file-list不能是Action地址
- :new与:old的用法
- 汇编语言中的常数
- Swift iOS 9通讯录访问
- tomcat开启远程调试
- $_SERVER['REQUEST_URI']获取不到值采用的函数
- CI构造函数
- 常见的http返回码
- 神经网络学习 之 M-P模型
- 使用snmp4j监听和发送消息
- UE4 Fog Sheet and Light Beams
- Style和Theme的区别