iOS Contacts框架unifiedContacts方法是否仅返回统一联系人?
unifiedContacts方法行为答疑 核心问题结论
未关联其他CNContact对象的独立联系人,会被unifiedContacts(matching:keysToFetch:)正常返回,不会被排除。
你对“统一联系人”的字面理解存在偏差:统一联系人是系统对多来源重复联系人做合并处理后的对外抽象,没有重复关联的独立联系人本身就是自己的统一联系人,自然符合返回条件。
测试结果一致的原因
你的测试环境仅有一个联系人容器,也没有合并过不同来源的重复联系人,这种场景下两个方法的返回结果本来就完全相同:
enumerateContacts(with:usingBlock:)遍历联系人时默认自动做统一合并处理,返回的已经是去重后的统一联系人对象unifiedContacts系列方法返回的是经过合并逻辑处理后的统一联系人数组,无重复联系人的场景下和前者返回内容完全对齐
两个方法的差异和适用场景
官方示例同时使用两个方法是因为二者的适用场景不同:
- 批量遍历全量联系人时优先选
enumerateContacts:它采用流式遍历的设计,内存占用更低,处理上千条联系人时不会一次性加载所有对象到内存 - 按指定条件筛选联系人时优先选
unifiedContacts:支持谓词筛选,代码更简洁,不需要自己实现遍历过滤逻辑,尤其适合按ID查询单个联系人、按容器查询指定分组联系人的场景
特殊场景下的差异
只有当设备存在多来源联系人(比如同时同步了iCloud、企业邮箱、第三方通讯录的联系人)、且存在被合并的重复联系人时,你才能观测到两个方法和非统一联系人的关联:此时所有方法返回的都是合并后的统一联系人,被合并的原始子卡片不会对外暴露,避免界面出现重复联系人。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

