найти контакт ios ABRecordRef в адресной книге по телефону, электронной почте, имени

Мне нужно найти контакт в AdreesBook, чтобы добавить новую социальную сеть. Иногда мне нужно найти контакт по его телефонам и электронной почте или по его телефонам, имени и фамилии, есть ли какой-либо запрос, чтобы получить контакт ABRecordRef вместо того, чтобы делать это?

Многие из моих пользователей имеют более 1000 контактов, и мне нужно обновить многие из них, поэтому неэффективно, если мое единственное решение - делать так много времени...

Есть идеи??

Спасибо!


person Aarranz    schedule 21.01.2015    source источник


Ответы (1)


Ниже приведен метод, который может помочь вам получить контактную информацию, используя номер телефона. Для этого используется kABPersonPhoneProperty, так же вы можете написать другие функции для поиска электронной почты и имени:

  • Для электронной почты используйте свойство: kABPersonEmailProperty
  • Для Имени: kABPersonFirstNameProperty

Для получения дополнительных сведений перейдите по ссылке: Справочник ABPerson

Надеюсь это поможет.

#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;
}
person Mrunal    schedule 21.01.2015
comment
Большое спасибо! я собираюсь попробовать это. Это работает, только если у меня есть только один правильный номер телефона? Могу ли я использовать массив в rangeOfString? - person Aarranz; 21.01.2015
comment
Это метод, который я использовал для поиска номера мобильного телефона в виде строки. В вашем случае вам может потребоваться немного изменить метод, а также зациклить функцию, если это массив чисел. - person Mrunal; 21.01.2015
comment
Хотя бы сначала попробуйте с поиском по одному контактному номеру. Затем постепенно обновляйте код. - person Mrunal; 21.01.2015