Introduction
CNContactStore是线程安全的类。
CNContactStore 执行各种查找和保存通讯录的请求。官方对使用该类加载通讯录的建议如下:
- 只获取将会被用到的通讯录属性。
- 当获取所有的通讯录和缓存结果的时候,首先要获取所有的通讯录ID,然后根据对应的ID来获取一批详细的通讯录。
- 要想统计几个通讯录的获取结果,首先要从获取结果中收集的唯一ID,然后根据那些唯一ID获取详细的通讯录。
- 如果你对获取的通讯录,群组,容器进行了缓存,那么当系统发送了CNContactStoreDidChangeNotification通知的时候,你需要重新获取,并且释放掉之前缓存的内容。
获取统一标准通讯录
1)-unifiedContactWithIdentifier:keysToFetch:error:
根据对应的通讯录ID获取一份统一的通讯录
参数
- identifier
- 通讯录ID
- keys
- 要获取的CNContact对象的属性
- error
- 错误
返回值
返回一份匹配的或者对应ID的统一的通讯录Discussion
由于统一化,返回的通讯录可能和你想要的的通讯录的ID不一致。要想根据ID获取一批通讯录,可以通predicateForContactsWithIdentifiers:和unifiedContactsMatchingPredicate:keysToFetch:error:这两个方法。建议只获取你需要用到的通讯录属性,同时你可以把通讯录key和通讯录key的描述符连接在一起。2)- unifiedContactsMatchingPredicate:keysToFetch:error:
根据对应的谓词获取一份统一的通讯录参数
- predicate
- 要匹配的断言
- keys
- CNContact对象的属性,注意你可以把通讯录key和通讯录key的描述符连接在一起。即CNContact类里面的常量key
- error
- 错误
返回值
返回一份匹配谓词的通讯录
Discussion
如果没有找到匹配的通讯录,这个方法将返回一个空的数组,防止报错。注意:只能使用CNContact类里面的谓词。这个方法支持不支持合成的谓词。
CNContact提供了三个返回predicate的类方法:
- predicateForContactsMatchingName:传入通讯录人名
- predicateForContactsWithIdentifiers:通讯录ID
- predicateForContactsInGroupWithIdentifier:群组ID
由于统一化,返回的通讯录可能和你想要的的通讯录的ID不一致。要想获取所有的通讯录,可以使用enumerateContactsWithFetchRequest:error:usingBlock:这个方法
获取隐私
1)+ authorizationStatusForEntityType:
获取当前通讯录的授权状态
返回结果是枚举类型:
{
- CNAuthorizationStatusNotDetermined,还未决定,即还未弹出过授权框
- CNAuthorizationStatusRestricted,被拒绝
- CNAuthorizationStatusDenied,被拒绝
- CNAuthorizationStatusAuthorized,允许访问
}CNAuthorizationStatus;参数
- entityType
- 实体类型(枚举),目前只有一个选项CNEntityTypeContacts
Discussion
你的应用可以根据授权状态展示或者隐藏获取通讯录的UI。这个方法是线程安全的,不会阻断线程。2)-requestAccessForEntityType:completionHandler:
请求授权获取用户的通讯录Parameters
- entityType
- 枚举类型 目前只有一个选项CNEntityTypeContacts
- completionHandler
- 完成回调,如果granted是YES表示获得权限
Discussion
用户可以允许或者拒绝应用获取自己的通讯录信息。通过上述方法获取通讯录信息。当有弹框询问用户是否授权的时候,这个方法不会阻断线程。用户只会被询问一次授权,后续的询问都会默认使用当前的授权信息。注意:完成的回调会在任意一个线程执行。建议你在回调方法中使用 CNContactStore的实例方法,而不是UI主线程。 当 CNContactStore 正在被后台线程使用的时候,这个方法是可选的。如果这个方法没有被调用,当用户被询问授权的时候 CNContactStore或许会阻断你的应用。获取和存储
###1)- groupsMatchingPredicate:error:
根据谓词获取所有匹配的群组参数
- predicate
- 用来匹配群组的断言,如果传nil将获取所有的群组。
- error
- 错误
返回值
返回一个匹配谓词的包含 CNGroup 对象的数组。
Discussion
如果没有找到匹配的群组,这个方法将返回一个空的数组。如果报错,这个方法将返回nil。你只能使用在CNGroup类中定义的断言来进行匹配。不支持合成的断言。根据不同的账号来源,通讯录可能是一个或多个群组的成员。
2)- containersMatchingPredicate:error:
获取所有匹配断言的容器。
参数
- predicate
- 用来匹配容器的谓词,如果传nil将获取所有的容器。
- error
- 报错
返回值
返回匹配谓词的包含 CNContainer对象的数组
Discussion
一个容器包含一个通讯录集合,一个通讯录(每个通讯录可以只在一个容器中)。 CardDAV账户通常只有一个通讯录容器。exchange账户有可能有多个容器,每个容器代表一个exchange文件。如果没有找到匹配的容器,这个方法将返回一个空数组。如果报错,这个方法将返回nil。你只能使用在CNContainer 类中定义的断言来进行匹配。不支持合成的断言。
3)- defaultContainerIdentifier
返回默认容器的ID.
返回值
返回默认容器的ID.
Discussion
返回的ID可以被用来获取一个默认容器。当用户想让一个通讯录隐藏添加到时候,会加到默认容器中。
4)-enumerateContactsWithFetchRequest:error:usingBlock:
返回一个波尔值来表示所有被遍历的通讯录是否匹配获取请求。
参数
- fetchRequest
- 特定搜索标准的请求
- error
- 错误信息
- block
- 当每个通讯录匹配到请求的时候的回调
返回值
如果所有被遍历的通讯录匹配获取请求返回YES,否则返回NO.
Discussion
这个方法会等到所有的遍历完成才调用回调方法,方法会返回YES。因为要把所有的通讯录数据加入到内存中很耗费性能,就可以用这个方法来获取所有通讯录。
5)- executeSaveRequest:error:
执行保存请求,返回成功或者失败
参数
- saveRequest
- 要执行的保存请求
- error
- 错误信息
返回值
如果保存成功返回YES,否则返回NO。
Discussion
建议不要在其他线程执行保存的通讯录,因为保存过程中系统可能会对通讯录信息进行其他操作。如果有重合的CNSaveRequest 请求同时发生,那么会应用最后一次保存结果。
Constants 常量
CNEntityType
用户可以授权获取的实体类型
typedef enum: NSInteger,
{
- CNEntityTypeContacts
}
CNEntityType;
CNContactStoreDidChangeNotification
CNContactStore 中内容发生改变的时候发出的通知