How to load all contacts in an array ios9

1k Views Asked by At

AddressBook api is deprecated in ios 9. I want to load all contacts in an array and display it in a UITableView. I don't want to use iOS default ContactPicker as I have to do some customization while displaying. How to load all contact list in an array for further use?

1

There are 1 best solutions below

0
On

First I had to check the permission id it is not defined then ask for permission for accessing contacts. Like this:

CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

if (status == CNAuthorizationStatusNotDetermined) {
    [self.contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error) {

        if (granted) {
            [self loadUserListFromPhoneBook];
        }
    }];
}
else if(status == CNAuthorizationStatusAuthorized) {
    [self loadUserListFromPhoneBook];
}

After that I had to iterate through the contact list and load all contacts like this:

-(void) loadUserListFromPhoneBookFor
{
    NSMutableArray *contacts = [NSMutableArray array];
    NSError *error;
    CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactIdentifierKey, [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]];

    BOOL success = [self.contactStore enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact *contact, BOOL *stop) {
        [contacts addObject:contact];
    }];
    if (!success) {
        NSLog(@"error = %@", error);
    }

    CNContactFormatter *formatter = [[CNContactFormatter alloc] init];

    for (CNContact *contact in contacts) {
        NSString *string = [formatter stringFromContact:contact];
        NSLog(@"contact = %@", string);
    }
}

You can use necessary keys for getting more information. Have a look at this for more information. Its has all new contact classes. This video of WWDC helped a lot.