Search code examples
swiftswift3cncontactcncontactstore

How to retrieve all contacts using CNContact.predicateForContacts?


So I have this code which works fine, but only if you have specified a name in the predicateForContacts parameter.

func retrieveContactsWithStore(store: CNContactStore) {
    do {
           let predicate = CNContact.predicateForContacts(matchingName: "John")
           let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey] as [Any]

           let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch as! [CNKeyDescriptor])
           self.objects = contacts
           DispatchQueue.main.async(execute: { () -> Void in
               self.myTableView.reloadData()
           })
       } catch {
           print(error)
       }
}

I'd like to retrieve all the names of the people listed on address book.


Solution

  • I'd like to retrieve all the names of the people listed on address book.

    Form a CNContactFetchRequest specifying that the keys you want are names, and call enumerateContacts(with:usingBlock:).

        let req = CNContactFetchRequest(keysToFetch: [
            CNContactFamilyNameKey as CNKeyDescriptor,
            CNContactGivenNameKey as CNKeyDescriptor
        ])
        try! CNContactStore().enumerateContacts(with: req) {
            contact, stop in
            print(contact) // in real life, probably populate an array
        }