Contacts FrameWork是苹果推出的新联系人框架。应用于iOS 9.0之后,9.0之后将会全面取代Address Book
。用过Address Book
的开发者都应该能理解苹果为何要弃用它了。一方面对于开发者实在不是很友好,语法怪怪的。另一方面,作者猜测可能是线程安全方面做得不够好,所以苹果打算有所改进。本文将阐述Contacts
和ContactsUI
的基本原理和基本用法。
Contacts
因为大部分的App都只是需要读取联系人信息而不需要做修改,因此Contacts
只能读取,同时它的线程安全得到很好的保障。
联系人对象
Contact
类是线程安全的,联系人的属性是不可以改变的,比如联系人的名称,图片,或者电话号码。这个类有点像NSDictionary
,里面存了各种类型的东西。和MutableDictionary
很类似,它有一个可变的子类CNMutableContact
,可以修改联系人的属性。联系人的某些属性可以有多个值,如电话号码或电子邮件地址,它们都是包含了CNLabeledValue
对象数组,CNLabeledValue
是很有意思的一个类,我个人感觉里面主要还是使用了swift的新特性puple
中文叫做元组。元组和数组类似,只不过里面数组的元素类型可以是不同的。一个CNLabeledValu
e对象其实就是包含了一个Label和一个Value的线程安全的不可变元组。每个Label描述了每个Value的使用者。比如电话号码,家庭号码和工作号码都是不同的Label。苹果已经提供了很多实用的标签,如果开发者觉得不够用也可以自己定义,我个人感觉够用了。
学习相关API
首先了解一下头文件中包含的相关类。头文件集中在<Contacts/Contacts.h>
, 我们依次过一遍相关的API。
#import <Contacts/CNLabeledValue.h>
#import <Contacts/CNPhoneNumber.h>
#import <Contacts/CNPostalAddress.h>
#import <Contacts/CNMutablePostalAddress.h>
#import <Contacts/CNInstantMessageAddress.h>
#import <Contacts/CNSocialProfile.h>
#import <Contacts/CNContactRelation.h>
CNLabeledValue
是一个泛型的类,可以使用如下方法直接返回一个CNLabeledValue
类型
+ (instancetype)labeledValueWithLabel:(nullable NSString *)label value:(ValueType)value;
CNContact
里面的属性都是以CNLabeledValue
,或是CNLabeledValue
数组的形式存在。如果实在难以理解CNLabeledValue
到底是什么,可以把它当作一个字典,Label类似于key,Value类似于字典里面的Value。然后联系人属性都是存储字典或是字典数组。
CNPhoneNumber
是电话号码类,主要包括了一个属性就是号码,至于到底是家庭号码还是工作号码 需要根据Label区分。
CNPostalAddress
和CNMutablePostalAddress
是邮寄地址也就是联系人地址。
CNSocialProfile
是社会化组件信息,比如FaceBook,微博这些
CNInstantMessageAddress
是即时通讯信息,比如QQ这些。
CNContactRelation
是联系人关系信息。
我们点其中任何一个类的头文件开会发现里面有很多类似如下的定义。
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberiPhone NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMobile NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberMain NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberHomeFax NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberWorkFax NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberOtherFax NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelPhoneNumberPager
他们是用于操作这些信息的Label,或是Key,用到什么再去找具体的就好。
#import <Contacts/CNContact.h>
#import <Contacts/CNContact+Predicates.h>
#import <Contacts/CNMutableContact.h>
CNContact
和CNMutableContact
不用多说,是系统用于存储联系人信息类。CNContact+Predicates
是用于联系人过滤筛选的类。
#import <Contacts/CNContactStore.h>
#import <Contacts/CNContactFetchRequest.h>