How to get a record of all contacts in iOS 9 using the Contacts application

Most of the AddressBook infrastructure is deprecated in iOS 9. The new documentation contact structure shows how to retrieve entries matching NSPredicate , but what if I want the entire entry?

+54
ios ios9 contacts nspredicate
Sep 19 '15 at 2:52
source share
16 answers

Both other answers only load contacts from the container using defaultContainerIdentifier . In a scenario where a user has several containers (i.e. Exchange and an iCloud account, which are both used to store contacts), this will only load contacts from the account that is configured as the default. Therefore, he will not download all contacts at the request of the author of the question.

Instead, you most likely want to make all the containers and iterate over them to extract all the contacts from each of them. The following code snippet is an example of how we do this in one of our applications (in Swift):

 lazy var contacts: [CNContact] = { let contactStore = CNContactStore() let keysToFetch = [ CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataAvailableKey, CNContactThumbnailImageDataKey] // Get all the containers var allContainers: [CNContainer] = [] do { allContainers = try contactStore.containersMatchingPredicate(nil) } catch { print("Error fetching containers") } var results: [CNContact] = [] // Iterate all containers and append their contacts to our results array for container in allContainers { let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier) do { let containerResults = try contactStore.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: keysToFetch) results.appendContentsOf(containerResults) } catch { print("Error fetching results for container") } } return results }() 
+89
Dec 04 '15 at 19:02
source share

Objective-C:

 //ios 9+ CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted == YES) { //keys with fetching properties NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey]; NSString *containerId = store.defaultContainerIdentifier; NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; NSError *error; NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error]; if (error) { NSLog(@"error fetching contacts %@", error); } else { for (CNContact *contact in cnContacts) { // copy data to my custom Contacts class. Contact *newContact = [[Contact alloc] init]; newContact.firstName = contact.givenName; newContact.lastName = contact.familyName; UIImage *image = [UIImage imageWithData:contact.imageData]; newContact.image = image; for (CNLabeledValue *label in contact.phoneNumbers) { NSString *phone = [label.value stringValue]; if ([phone length] > 0) { [contact.phones addObject:phone]; } } } } } }]; 

Also, to get all the contacts, you can use the enumerateContactsWithFetchRequest method:

 CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted == YES) { //keys with fetching properties NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey]; CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys]; NSError *error; BOOL success = [store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop) { if (error) { NSLog(@"error fetching contacts %@", error); } else { // copy data to my custom Contact class. Contact *newContact = [[Contact alloc] init]; newContact.firstName = contact.givenName; newContact.lastName = contact.familyName; // etc. } }]; } }]; 

If you want to filter contacts by name , you can use this:

Obj-C:

 // keys from example above NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey]; NSArray *cnContacts = [store unifiedContactsMatchingPredicate:[CNContact predicateForContactsMatchingName:@"John Appleseed"] keysToFetch:keys error:&error]; 

Swift 3:

 let store = CNContactStore() let contacts = try store.unifiedContactsMatchingPredicate(CNContact.predicateForContactsMatchingName("Appleseed"), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey]) 

The official documentation is here: https://developer.apple.com/reference/contacts

+38
Oct 29 '15 at 10:42 on
source share

Using Swift and Contacts to get all contacts, including name and phone numbers

 import contacts let store = CNContactStore() store.requestAccessForEntityType(.Contacts, completionHandler: { granted, error in guard granted else { let alert = UIAlertController(title: "Can't access contact", message: "Please go to Settings -> MyApp to enable contact permission", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) return } let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), CNContactPhoneNumbersKey] let request = CNContactFetchRequest(keysToFetch: keysToFetch) var cnContacts = [CNContact]() do { try store.enumerateContactsWithFetchRequest(request){ (contact, cursor) -> Void in cnContacts.append(contact) } } catch let error { NSLog("Fetch contact error: \(error)") } NSLog(">>>> Contact list:") for contact in cnContacts { let fullName = CNContactFormatter.stringFromContact(contact, style: .FullName) ?? "No Name" NSLog("\(fullName): \(contact.phoneNumbers.description)") } }) 

Contact capture is slow , so you should not block the main UI thread. Do a CNContactFetchRequest in the background thread. This is why I entered the code in the Handler termination. It runs on a background thread.

+10
Jun 23 '16 at 9:14
source share

Get full name, email id, phone number, profile picture and date of birth from contact structure in iOS9

 #pragma mark #pragma mark -- Getting Contacts From AddressBook -(void)contactsDetailsFromAddressBook{ //ios 9+ CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted == YES) { //keys with fetching properties NSArray *keys = @[CNContactBirthdayKey,CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactEmailAddressesKey]; NSString *containerId = store.defaultContainerIdentifier; NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; NSError *error; NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error]; if (error) { NSLog(@"error fetching contacts %@", error); } else { NSString *phone; NSString *fullName; NSString *firstName; NSString *lastName; UIImage *profileImage; NSDateComponents *birthDayComponent; NSMutableArray *contactNumbersArray; NSString *birthDayStr; NSMutableArray *emailArray; NSString* email = @""; for (CNContact *contact in cnContacts) { // copy data to my custom Contacts class. firstName = contact.givenName; lastName = contact.familyName; birthDayComponent = contact.birthday; if (birthDayComponent == nil) { // NSLog(@"Component: %@",birthDayComponent); birthDayStr = @"DOB not available"; }else{ birthDayComponent = contact.birthday; NSInteger day = [birthDayComponent day]; NSInteger month = [birthDayComponent month]; NSInteger year = [birthDayComponent year]; // NSLog(@"Year: %ld, Month: %ld, Day: %ld",(long)year,(long)month,(long)day); birthDayStr = [NSString stringWithFormat:@"%ld/%ld/%ld",(long)day,(long)month,(long)year]; } if (lastName == nil) { fullName=[NSString stringWithFormat:@"%@",firstName]; }else if (firstName == nil){ fullName=[NSString stringWithFormat:@"%@",lastName]; } else{ fullName=[NSString stringWithFormat:@"%@ %@",firstName,lastName]; } UIImage *image = [UIImage imageWithData:contact.imageData]; if (image != nil) { profileImage = image; }else{ profileImage = [UIImage imageNamed:@"placeholder.png"]; } for (CNLabeledValue *label in contact.phoneNumbers) { phone = [label.value stringValue]; if ([phone length] > 0) { [contactNumbersArray addObject:phone]; } } ////Get all E-Mail addresses from contacts for (CNLabeledValue *label in contact.emailAddresses) { email = label.value; if ([email length] > 0) { [emailArray addObject:email]; } } //NSLog(@"EMAIL: %@",email); NSDictionary* personDict = [[NSDictionary alloc] initWithObjectsAndKeys: fullName,@"fullName",profileImage,@"userImage",phone,@"PhoneNumbers",birthDayStr,@"BirthDay",email,@"userEmailId", nil]; // NSLog(@"Response: %@",personDict); [self.contactsArray addObject:personDict]; } dispatch_async(dispatch_get_main_queue(), ^{ [self.tableViewRef reloadData]; }); } } }]; } 
+7
Apr 26 '16 at 11:30
source share

Apple actually recommends enumerateContactsWithFetchRequest from CNContactStore for retrieving all contacts and NOT unifiedContactsMatchingPredicate.

Below is the working code for Obj-C.

 CNContactStore *store = [[CNContactStore alloc] init]; //keys with fetching properties NSArray *keys = @[CNContactGivenNameKey, CNContactPhoneNumbersKey]; CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys]; NSError *error; [store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop) { // access it this way -> contact.givenName; etc }]; 

Here is the link where apple recommends listing the function: https://developer.apple.com/reference/contacts/cncontactstore/1403266-unifiedcontactsmatchingpredicate?language=objc#discussion

If the link has expired, here is what Apple wrote:

If no matches are found, this method returns an empty array (or nil in case of an error). Use only predicates from the CNContact class of predicates. This method does not support complex predicates. In connection with the association, the returned contacts may have different identifiers than you specify. To get all contacts use enumerateContactsWithFetchRequest:error:usingBlock:

+7
Aug 22 '16 at 8:19
source share

In swift 3 and Xcode 8 you can get a list of all contacts

 let keys = [CNContactGivenNameKey ,CNContactImageDataKey,CNContactPhoneNumbersKey] var message: String! //let request=CNContactFetchRequest(keysToFetch: keys) let contactsStore = AppDelegate.AppDel.contactStore // Get all the containers var allContainers: [CNContainer] = [] do { allContainers = try contactsStore.containers(matching: nil) } catch { print("Error fetching containers") } // Iterate all containers and append their contacts to our results array for container in allContainers { let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier) do { let containerResults = try contactsStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keys as [CNKeyDescriptor]) self.results.append(contentsOf: containerResults) self.tableView.reloadData() message="\(self.results.count)" } catch { print("Error fetching results for container") } } 
+6
Nov 25 '16 at 10:55
source share

first enter default container id and use container id with predicate id

 let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] let containerId = CNContactStore().defaultContainerIdentifier() let predicate: NSPredicate = CNContact.predicateForContactsInContainerWithIdentifier(containerId) let contacts = try CNContactStore().unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch) 
+5
Sep 19 '15 at 14:55
source share

For Swift 4

  var results: [CNContact] = [] let fetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactMiddleNameKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor,CNContactPhoneNumbersKey as CNKeyDescriptor]) fetchRequest.sortOrder = CNContactSortOrder.userDefault let store = CNContactStore() do { try store.enumerateContacts(with: fetchRequest, usingBlock: { (contact, stop) -> Void in print(contact.phoneNumbers.first?.value ?? "no") results.append(contact) }) } catch let error as NSError { print(error.localizedDescription) } 

The old version for quick results var contains all contacts

 let contactStore = CNContactStore() var results: [CNContact] = [] do { try contactStore.enumerateContactsWithFetchRequest(CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactMiddleNameKey, CNContactEmailAddressesKey,CNContactPhoneNumbersKey])) { (contact, cursor) -> Void in results.append(contact) } } catch{ print("Handle the error please") } 
+5
Dec 17 '15 at 8:02
source share

CNContact on iOS 9

Goal c

 #import "ViewController.h" #import <Contacts/Contacts.h> @interface ViewController () { NSMutableArray *arrayTableData; } @end @implementation ViewController -(void)viewDidLoad { [self fetchContactsandAuthorization]; } //This method is for fetching contacts from iPhone.Also It asks authorization permission. -(void)fetchContactsandAuthorization { // Request authorization to Contacts CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted == YES) { //keys with fetching properties NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey]; NSString *containerId = store.defaultContainerIdentifier; NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; NSError *error; NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error]; if (error) { NSLog(@"error fetching contacts %@", error); } else { NSString *phone; NSString *fullName; NSString *firstName; NSString *lastName; UIImage *profileImage; NSMutableArray *contactNumbersArray = [[NSMutableArray alloc]init]; for (CNContact *contact in cnContacts) { // copy data to my custom Contacts class. firstName = contact.givenName; lastName = contact.familyName; if (lastName == nil) { fullName=[NSString stringWithFormat:@"%@",firstName]; }else if (firstName == nil){ fullName=[NSString stringWithFormat:@"%@",lastName]; } else{ fullName=[NSString stringWithFormat:@"%@ %@",firstName,lastName]; } UIImage *image = [UIImage imageWithData:contact.imageData]; if (image != nil) { profileImage = image; }else{ profileImage = [UIImage imageNamed:@"person-icon.png"]; } for (CNLabeledValue *label in contact.phoneNumbers) { phone = [label.value stringValue]; if ([phone length] > 0) { [contactNumbersArray addObject:phone]; } } NSDictionary* personDict = [[NSDictionary alloc] initWithObjectsAndKeys: fullName,@"fullName",profileImage,@"userImage",phone,@"PhoneNumbers", nil]; [arrayTableData addObject:[NSString stringWithFormat:@"%@",[personDict objectForKey:@"fullName"]]]; NSLog(@"The contactsArray are - %@",arrayTableData); } dispatch_async(dispatch_get_main_queue(), ^{ [tableViewContactData reloadData]; }); } } }]; } @end 

Output signal

 The contactsArray are - ( "John Appleseed", "Kate Bell", "Anna Haro", "Daniel Higgins", "David Taylor", "Hank Zakroff" } 
+4
Mar 26 '16 at 17:50
source share

@rocolitis answer fast! His answer is the best way to do this, according to Apple's documentation.

 let contactStore = CNContactStore() let keys = [CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactNicknameKey] as [CNKeyDescriptor] let request = CNContactFetchRequest(keysToFetch: keys) try? contactStore.enumerateContacts(with: request) { (contact, error) in // Do something with contact } 

You should probably first check your access to your contacts!

 let authorization = CNContactStore.authorizationStatus(for: CNEntityType.contacts) switch authorization { case .authorized: break case .denied: break case .restricted: break case .notDetermined: break } 
+4
Nov 02 '16 at 19:36
source share

SWIFT 2

Get full name, email address, phone number, profile picture from the contact structure in iOS9

NOTE. Contacts without a name have also been processed.

Step 1

 import Contacts 

Step 2

 func fetchContacts(completion: (result: NSMutableArray) -> Void ) { let finalArrayForContacts = NSMutableArray() let contactsArray = NSMutableArray() let requestForContacts = CNContactFetchRequest(keysToFetch: [CNContactIdentifierKey, CNContactFormatter.descriptorForRequiredKeysForStyle(CNContactFormatterStyle.FullName), CNContactPhoneNumbersKey ,CNContactThumbnailImageDataKey]) do{ try contactStore.enumerateContactsWithFetchRequest(requestForContacts) { (contactStore : CNContact, stop: UnsafeMutablePointer<ObjCBool>) -> Void in contactsArray.addObject(contactStore) } } catch { } if contactsArray.count > 0 { let formatter = CNContactFormatter() for contactTemp in contactsArray { let contactNew = contactTemp as! CNContact //Contact Name var stringFromContact = formatter.stringFromContact(contactNew) if stringFromContact == nil { stringFromContact = "Unnamed" } var imageData = NSData?() if contactNew.thumbnailImageData != nil{ imageData = contactNew.thumbnailImageData! }else{ // imageData = nil } var tempArray : NSArray = NSArray() if (contactNew.phoneNumbers).count > 0 { tempArray = ((contactNew.phoneNumbers as? NSArray)?.valueForKey("value").valueForKey("digits")) as! NSArray for i in 0 ..< tempArray.count { let newDict = NSMutableDictionary() let phoneNumber : String = (tempArray.objectAtIndex(i)) as! String if phoneNumber.characters.count > 0 { var test = false if phoneNumber.hasPrefix("+") { test = true } var resultString : String = (phoneNumber.componentsSeparatedByCharactersInSet(characterSet) as NSArray).componentsJoinedByString("") if test == true { resultString = "+\(resultString)" } newDict.setValue(resultString, forKey: "contact_phone") newDict.setValue(stringFromContact, forKey: "contact_name") newDict.setValue("0", forKey: "contact_select") newDict.setValue(imageData, forKey: "contact_image") finalArrayForContacts.addObject(newDict) } } }else{ // no number saved } } }else { print("No Contacts Found") } completion(result: finalArrayForContacts) } 
+2
Jul 18 '16 at 10:40
source share

Currently in iOS9, ABAddressBookRef is deprecated, so to get all the contacts from your phone, use this structure and add this function, you will get an array of contacts.

import the contact structure in a class .h like this

 #import <Contacts/Contacts.h> 

then add this method to the .m file

  -(void)contactsFromAddressBook{ //ios 9+ CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted == YES) { //keys with fetching properties NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey]; NSString *containerId = store.defaultContainerIdentifier; NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; NSError *error; NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error]; if (error) { NSLog(@"error fetching contacts %@", error); } else { NSString *phone; NSString *fullName; NSString *firstName; NSString *lastName; UIImage *profileImage; NSMutableArray *contactNumbersArray; for (CNContact *contact in cnContacts) { // copy data to my custom Contacts class. firstName = contact.givenName; lastName = contact.familyName; if (lastName == nil) { fullName=[NSString stringWithFormat:@"%@",firstName]; }else if (firstName == nil){ fullName=[NSString stringWithFormat:@"%@",lastName]; } else{ fullName=[NSString stringWithFormat:@"%@ %@",firstName,lastName]; } UIImage *image = [UIImage imageWithData:contact.imageData]; if (image != nil) { profileImage = image; }else{ profileImage = [UIImage imageNamed:@"person-icon.png"]; } for (CNLabeledValue *label in contact.phoneNumbers) { phone = [label.value stringValue]; if ([phone length] > 0) { [contactNumbersArray addObject:phone]; } } NSDictionary* personDict = [[NSDictionary alloc] initWithObjectsAndKeys: fullName,@"fullName",profileImage,@"userImage",phone,@"PhoneNumbers", nil]; [MutableArray__Contact addObject:personDict]; } dispatch_async(dispatch_get_main_queue(), ^ { NSLog(@"%@",ar_Contact); //[self.tableViewRef reloadData]; }); } } }]; } 

to use this method call contacts FromAddressBook function

 [self contactsFromAddressBook]; 
+1
Mar 23 '16 at 5:39
source share

Contact Permissions iOS 9 SWIFT 2

  let status : CNAuthorizationStatus = CNContactStore.authorizationStatusForEntityType(CNEntityType.Contacts) if status == CNAuthorizationStatus.NotDetermined{ contactStore.requestAccessForEntityType(CNEntityType.Contacts, completionHandler: { (temp: Bool, error : NSError?) -> Void in //call contacts fetching function }) }else if status == CNAuthorizationStatus.Authorized { //call contacts fetching function }) } else if status == CNAuthorizationStatus.Denied { } } 
+1
Jul 18 '16 at 10:50
source share

I am trying to use this code. I can get all the contact data using this code in the latest swift3 framework using contacts:

 let requestForContacts = CNContactFetchRequest(keysToFetch: [CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: CNContactFormatterStyle.fullName), CNContactPhoneNumbersKey as CNKeyDescriptor ,CNContactImageDataKey as CNKeyDescriptor,CNContactEmailAddressesKey as CNKeyDescriptor,CNContactBirthdayKey as CNKeyDescriptor]) do { try self.store.enumerateContacts(with: requestForContacts) { contact, stop in print("contact:\(contact)") self.contacts.append(contact) } } catch { print(error) } for contact in self.contacts { print(contact) let firstName = contact.givenName nameArray.append(firstName) print("first:\(firstName)") let phoneNumber = (contact.phoneNumbers[0].value).value(forKey: "digits") phoneNumberArray.append(phoneNumber as! String) let emailAddress = contact.emailAddresses[0].value(forKey: "value") emailAddressArray.append(emailAddress as! String) } CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys (for: CNContactFormatterStyle.fullName), CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor, CNContactBirthdayKey as CNKeyDescriptor]) let requestForContacts = CNContactFetchRequest(keysToFetch: [CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: CNContactFormatterStyle.fullName), CNContactPhoneNumbersKey as CNKeyDescriptor ,CNContactImageDataKey as CNKeyDescriptor,CNContactEmailAddressesKey as CNKeyDescriptor,CNContactBirthdayKey as CNKeyDescriptor]) do { try self.store.enumerateContacts(with: requestForContacts) { contact, stop in print("contact:\(contact)") self.contacts.append(contact) } } catch { print(error) } for contact in self.contacts { print(contact) let firstName = contact.givenName nameArray.append(firstName) print("first:\(firstName)") let phoneNumber = (contact.phoneNumbers[0].value).value(forKey: "digits") phoneNumberArray.append(phoneNumber as! String) let emailAddress = contact.emailAddresses[0].value(forKey: "value") emailAddressArray.append(emailAddress as! String) } 
+1
Mar 03 '17 at 10:15
source share

Cody answer in Swift 3:

 import Contacts 

Then, within any function that you use:

  let store = CNContactStore() store.requestAccess(for: .contacts, completionHandler: { granted, error in guard granted else { let alert = UIAlertController(title: "Can't access contact", message: "Please go to Settings -> MyApp to enable contact permission", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) return } let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey] as [Any] let request = CNContactFetchRequest(keysToFetch: keysToFetch as! [CNKeyDescriptor]) var cnContacts = [CNContact]() do { try store.enumerateContacts(with: request){ (contact, cursor) -> Void in cnContacts.append(contact) } } catch let error { NSLog("Fetch contact error: \(error)") } print(">>>> Contact list:") for contact in cnContacts { let fullName = CNContactFormatter.string(from: contact, style: .fullName) ?? "No Name" print("\(fullName): \(contact.phoneNumbers.description)") } }) 
+1
03 Mar. '17 at 23:27
source share

Here is the version of swift 3.0 flohei answer

 lazy var contacts: [CNContact] = { let contactStore = CNContactStore() let keysToFetch = [ CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPostalAddressesKey, CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataAvailableKey, CNContactThumbnailImageDataKey] as [Any] // Get all the containers var allContainers: [CNContainer] = [] do { allContainers = try contactStore.containers(matching: nil) } catch { print("Error fetching containers") } var results: [CNContact] = [] // Iterate all containers and append their contacts to our results array for container in allContainers { let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier) do { let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as! [CNKeyDescriptor]) results.append(contentsOf: containerResults) } catch { print("Error fetching results for container") } } return results }() 

Hope this helps!

+1
May 15, '17 at 21:43
source share



All Articles