如何使用Swift 3获取未命名为“John”的联系人

时间:2017-03-12 15:06:03

标签: ios swift contacts cncontactstore

有没有办法可以使用Contacts framework 在没有属性的情况下获取联系人?

示例:

myContactArray = unifiedContactsNotCalled("John")

PS:我知道这条线与实际代码完全不同,它只是用于说明目的的服务建议

1 个答案:

答案 0 :(得分:3)

在我概述如何找到与名称不匹配的内容之前,让我们回顾一下如何找到符合名称的内容。简而言之,您使用谓词:

let predicate = CNContact.predicateForContacts(matchingName: searchString)
let matches = try store.unifiedContacts(matching: predicate, keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)])    // use whatever keys you want

(显然,您将其包含在do - try - catch结构中,或者您想要的任何错误处理模式中。)

不幸的是,您不能在Contacts框架中使用自己的自定义谓词,而只能使用CNContact预定义谓词。因此,如果您要查找名称不包含" John"的联系人,则必须手动enumerateContacts(with:)并根据该结果构建结果:

let formatter = CNContactFormatter()
formatter.style = .fullName

let request = CNContactFetchRequest(keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)])   // include whatever other keys you may need

// find those contacts that do not contain the search string

var matches = [CNContact]()
try store.enumerateContacts(with: request) { contact, stop in
    if !(formatter.string(from: contact)?.localizedCaseInsensitiveContains(searchString) ?? false) {
        matches.append(contact)
    }
}