Eugene Teh Eugene Teh - 3 months ago 83
Swift Question

Swift iOS9 New Contacts Framework - How to retrieve only CNContact that has a valid email address?

In the latest Contacts framework for iOS9, how to retrieve only CNContact that has a valid email address?

Current code:

func getContacts() -> [CNContact] {
let contactStore = CNContactStore()
let predicate: NSPredicate = NSPredicate(format: "")
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey]

do {
return try contactStore.unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch)
} catch {
return []
}
}

Answer

For now (iOS 9.0) it seems that no predicates (see CNContact Predicates) are available to filter contacts by email address!

You can't write a custom predicate to filter contacts, as the doc says: "Note that generic and compound predicates are not supported by the Contacts framework"

But of course you can do it "manually", I show you an example using fast enumeration:

let contactStore = CNContactStore()
fetchRequest.unifyResults = true //True should be the default option
do {
    try contactStore.enumerateContactsWithFetchRequest(CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey])) {
        (contact, cursor) -> Void in
        if (!contact.emailAddresses.isEmpty){
            //Add to your array
        }
    }
}
catch{
    print("Handle the error please")
}
Comments