iOS9-CNContactStoreAPI翻译

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 中内容发生改变的时候发出的通知