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

Трябва да намеря контакт в AdreesBook, за да добавя нова социална мрежа. Понякога трябва да намеря контакт по неговите телефони и имейли или по неговите телефони, собствено и фамилно име, има ли някаква заявка за получаване на ABRecordRef контакт, вместо да правя whiles?

Много от моите потребители имат повече от 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