Thursday 7 August 2014

Get address book or phone book from iOS7

Without memory leak & crashing.



#pragma mark - get address book
- (NSArray *)getAllContacts{
   
    CFErrorRef *error = nil;
   
   
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
   
    __block BOOL accessGranted = NO;
    if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            accessGranted = granted;
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
       
    }
    else { // we're on iOS 5 or older
        accessGranted = YES;
    }
   
    if (accessGranted) {
       
#ifdef DEBUG
        NSLog(@"Fetching contact info ----> ");
#endif
       
       
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
        ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
        CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);
        CFIndex nPeople = CFArrayGetCount(allPeople);
        NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople];
       
       
        for (int i = 0; i < nPeople; i++)
        {
            ContactsData *contacts = [ContactsData new];
           
            ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
           
            //get First Name and Last Name
           
            contacts.firstNames = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
           
            contacts.lastNames =  (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);
           
            if (!contacts.firstNames) {
                contacts.firstNames = @"";
            }
            if (!contacts.lastNames) {
                contacts.lastNames = @"";
            }
           
            // get contacts picture, if pic doesn't exists, show standart one
           
            //            NSData  *imgData = (__bridge NSData *)ABPersonCopyImageData(person);
            //            contacts.image = [UIImage imageWithData:imgData];
            //            if (!contacts.image) {
            //                contacts.image = [UIImage imageNamed:@"NOIMG.png"];
            //            }
            //            //get Phone Numbers
            //
            //            NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init];
            //
            //            ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty);
            //            for(CFIndex i=0;i<ABMultiValueGetCount(multiPhones);i++) {
            //
            //                CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i);
            //                NSString *phoneNumber = (__bridge NSString *) phoneNumberRef;
            //                [phoneNumbers addObject:phoneNumber];
            //
            //                //NSLog(@"All numbers %@", phoneNumbers);
            //
            //            }
           
           
            //            [contacts setNumbers:phoneNumbers];
           
            //get Contact email
           
            NSMutableArray *contactEmails = [NSMutableArray new];
            ABMultiValueRef multiEmails = ABRecordCopyValue(person, kABPersonEmailProperty);
           
            for (CFIndex i=0; i<ABMultiValueGetCount(multiEmails); i++) {
                CFStringRef contactEmailRef = ABMultiValueCopyValueAtIndex(multiEmails, i);
                NSString *contactEmail = (__bridge_transfer NSString *)contactEmailRef;
               
                [contactEmails addObject:contactEmail];
                // NSLog(@"All emails are:%@", contactEmails);

               
            }
            CFBridgingRelease(multiEmails);
            [contacts setEmails:contactEmails];
           



           
            //---- if no mail id found then dont add contact
            if (contactEmails && contactEmails.count != 0) {
                [items addObject:contacts];
            }
           
           
#ifdef DEBUG
            //            NSLog(@"Person is: %@ # %@", contacts.firstNames,contacts.lastNames);
            //            NSLog(@"Phones are: %@", contacts.numbers);
            //            NSLog(@"Email is:%@", contacts.emails);
#endif
           
           
           
           
        }
        CFBridgingRelease(addressBook);
        CFBridgingRelease(allPeople);
        CFBridgingRelease(source);
       
        return items;
       
       
       
    } else {
#ifdef DEBUG
        NSLog(@"Cannot fetch Contacts :( ");
#endif
        return nil;
       
       
    }
   
}

No comments:

Post a Comment