ioscontactsabaddressbookabrecord

find ios ABRecordRef contact in AddressBook by phone, email, name


I need to find a contact in AdreesBook in order to add a new social network. Sometimes I have to find a contact by its phones and emails or by its phones, firstName and lastName, is there any kind of query to get ABRecordRef contact instead of doing whiles?

Many of my users have more than 1000 contacts and I need to update many of them, so it is not efficient if my only solution is to do so many whiles...

Any idea??

Thanks!


Solution

  • Below is method which may help you to get the Contact details using phone number. For that its used kABPersonPhoneProperty, same way you can write another functions for searching email and name:

    For more details, go through: ABPerson Reference

    Hope this helps.

    #import <AddressBook/AddressBook.h>
    
    -(NSArray *)contactsContainingPhoneNumber:(NSString *)phoneNumber {
        /*
         Returns an array of contacts that contain the phone number
         */
    
        // Remove non numeric characters from the phone number
        phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
    
        // Create a new address book object with data from the Address Book database
        CFErrorRef error = nil;
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
        if (!addressBook) {
            return [NSArray array];
        } else if (error) {
            CFRelease(addressBook);
            return [NSArray array];
        }
    
        // Requests access to address book data from the user
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {});
    
        // Build a predicate that searches for contacts that contain the phone number
        NSPredicate *predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary *bindings) {
            ABMultiValueRef phoneNumbers = ABRecordCopyValue( (__bridge ABRecordRef)record, kABPersonPhoneProperty);
            BOOL result = NO;
            for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
                NSString *contactPhoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
                contactPhoneNumber = [[contactPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
                if ([contactPhoneNumber rangeOfString:phoneNumber].location != NSNotFound) {
                    result = YES;
                    break;
                }
            }
            CFRelease(phoneNumbers);
            return result;
        }];
    
        // Search the users contacts for contacts that contain the phone number
        NSArray *allPeople = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
        NSArray *filteredContacts = [allPeople filteredArrayUsingPredicate:predicate];
        CFRelease(addressBook);
    
        return filteredContacts;
    }