使用Swift2我试图找到属于“工作”组成员的所有联系人,然后返回这些联系人。
创建谓词后。
let workPred = CNContact.predicateForContactsInGroupWithIdentifier("Work")
let keysToFetch = [CNContactGivenNameKey]
let results = contacts.unifiedContactsMatchingPredicate(workPred, keysToFetch)
但是,当有组ID的联系人时,它总是返回0结果。
答案 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
上)来直接匹配组名。