Fetch Contacts in iOS 7 Fetch Contacts in iOS 7 ios ios

Fetch Contacts in iOS 7


Today updated my example and removed memory leaks :)

 + (NSArray *)getAllContacts {    CFErrorRef *error = nil;    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);    ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);    CFArrayRef allPeople = (ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName));    //CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);      CFIndex nPeople = CFArrayGetCount(allPeople); // bugfix who synced contacts with facebook    NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople];    if (!allPeople || !nPeople) {        NSLog(@"people nil");    }    for (int i = 0; i < nPeople; i++) {        @autoreleasepool {            //data model            ContactsData *contacts = [ContactsData new];            ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);            //get First Name            CFStringRef firstName = (CFStringRef)ABRecordCopyValue(person,kABPersonFirstNameProperty);            contacts.firstNames = [(__bridge NSString*)firstName copy];            if (firstName != NULL) {                CFRelease(firstName);            }            //get Last Name            CFStringRef lastName = (CFStringRef)ABRecordCopyValue(person,kABPersonLastNameProperty);            contacts.lastNames = [(__bridge NSString*)lastName copy];            if (lastName != NULL) {                CFRelease(lastName);            }            if (!contacts.firstNames) {                contacts.firstNames = @"";            }            if (!contacts.lastNames) {                contacts.lastNames = @"";            }            contacts.contactId = ABRecordGetRecordID(person);            //append first name and last name            contacts.fullname = [NSString stringWithFormat:@"%@ %@", contacts.firstNames, contacts.lastNames];            // get contacts picture, if pic doesn't exists, show standart one            CFDataRef imgData = ABPersonCopyImageData(person);            NSData *imageData = (__bridge NSData *)imgData;            contacts.image = [UIImage imageWithData:imageData];            if (imgData != NULL) {                CFRelease(imgData);            }            if (!contacts.image) {                contacts.image = [UIImage imageNamed:@"avatar.png"];            }            //get Phone Numbers            NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init];            ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty);            for(CFIndex i=0; i<ABMultiValueGetCount(multiPhones); i++) {                @autoreleasepool {                    CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i);                    NSString *phoneNumber = CFBridgingRelease(phoneNumberRef);                    if (phoneNumber != nil)[phoneNumbers addObject:phoneNumber];                    //NSLog(@"All numbers %@", phoneNumbers);                }            }            if (multiPhones != NULL) {                CFRelease(multiPhones);            }            [contacts setNumbers:phoneNumbers];            //get Contact email            NSMutableArray *contactEmails = [NSMutableArray new];            ABMultiValueRef multiEmails = ABRecordCopyValue(person, kABPersonEmailProperty);            for (CFIndex i=0; i<ABMultiValueGetCount(multiEmails); i++) {                @autoreleasepool {                    CFStringRef contactEmailRef = ABMultiValueCopyValueAtIndex(multiEmails, i);                    NSString *contactEmail = CFBridgingRelease(contactEmailRef);                    if (contactEmail != nil)[contactEmails addObject:contactEmail];                    // NSLog(@"All emails are:%@", contactEmails);                }            }            if (multiEmails != NULL) {                CFRelease(multiEmails);            }            [contacts setEmails:contactEmails];            [items addObject:contacts];#ifdef DEBUG            //NSLog(@"Person is: %@", contacts.firstNames);            //NSLog(@"Phones are: %@", contacts.numbers);            //NSLog(@"Email is:%@", contacts.emails);#endif        }    } //autoreleasepool    CFRelease(allPeople);    CFRelease(addressBook);    CFRelease(source);    return items;}

Actually recently wrote pod in Swift 3 using CNContacts, to whom it may need

Swift ContactBook Picker


Didn't write it myself. But it works with me:

ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {       ABAddressBookRef addressBook = ABAddressBookCreate( );    });}else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {    CFErrorRef *error = NULL;    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);    CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);    for(int i = 0; i < numberOfPeople; i++) {        ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );       // NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));       // NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));       // NSLog(@"Name:%@ %@", firstName, lastName);        ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);        [[UIDevice currentDevice] name];        //NSLog(@"\n%@\n", [[UIDevice currentDevice] name]);        for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {            NSString *phoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);            addressBookNum = [addressBookNum stringByAppendingFormat: @":%@",phoneNumber];        }      }    NSLog(@"AllNumber:%@",addressBookNum);}else {    // Send an alert telling user to change privacy setting in settings app}

and in my .h

@property NSString * addressBookNum;