使用CNContact通过组搜索联系人

时间:2015-10-07 15:58:28

标签: iphone swift2 ios9

使用Swift2我试图找到属于“工作”组成员的所有联系人,然后返回这些联系人。

创建谓词后。

let workPred = CNContact.predicateForContactsInGroupWithIdentifier("Work")
let keysToFetch = [CNContactGivenNameKey]
let results = contacts.unifiedContactsMatchingPredicate(workPred, keysToFetch)

但是,当有组ID的联系人时,它总是返回0结果。

1 个答案:

答案 0 :(得分:8)

"Work"不是组标识符。您必须通过CNContactStore groupsMatchingPredicate

获取群组
  • func groupsMatchingPredicate(_ predicate: NSPredicate?) throws -> [CNGroup]

然后您将获得一组CNGroup个对象。每个CNGroup都有两个属性:

  • name
  • identifier

因此CNGroup.identifier是您要在谓词中使用的内容。 CNGroup个对象的示例:

[
  <CNGroup: 0x7fe563ca91f0: identifier=2DFE28EB-A9CA-4920-A77D-46BEE5A09E96, name=Friends>,
  <CNGroup: 0x7fe563ca3bc0: identifier=E007B6DD-F456-48FA-A564-32256A898B67, name=Work>
]

在这里您可以看到标识符是生成UUID的。不是组名。

以下是一个例子:

do {
  let store = CNContactStore()

  let groups = try store.groupsMatchingPredicate(nil)
  let filteredGroups = groups.filter { $0.name == "Work" }

  guard let workGroup = filteredGroups.first else {
    print("No Work group")
    return
  }

  let predicate = CNContact.predicateForContactsInGroupWithIdentifier(workGroup.identifier)
  let keysToFetch = [CNContactGivenNameKey]
  let contacts = try store.unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch)

  print(contacts)
}
catch {
  print("Handle error")
}

没有找到任何合适的谓词(在CNGroup上)来直接匹配组名。