Как найти в адресной книге iphone определенный номер телефона?

Я разрабатываю приложение, которое подключается к другому iphone с помощью bonjour. Одна из его функций - когда я подключаюсь к другому устройству, оно автоматически проверяет, есть ли у меня телефонный номер другого человека. Итак, моя проблема в том, как мне проверить свою адресную книгу на номер телефона, предоставленный другим устройством?


person Adam Adamou    schedule 24.11.2010    source источник


Ответы (3)


Вот пример, извлеченный из одного из моих методов адресной книги. Я не искал по номеру телефона, но это дает вам представление о том, как продвигаться вперед с тем, что вам нужно:

- (void) scanAddressBookSample
    {
    NSUInteger i;
    NSUInteger k;

    ABAddressBookRef addressBook = ABAddressBookCreate();
    NSArray *people = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);

    if ( people==nil )
        {
        NSLog(@"NO ADDRESS BOOK ENTRIES TO SCAN");
        CFRelease(addressBook);
        return;
        }

    for ( i=0; i<[people count]; i++ )
        {
        ABRecordRef person = (ABRecordRef)[people objectAtIndex:i];

        //
        // Phone Numbers
        //
        ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
        CFIndex phoneNumberCount = ABMultiValueGetCount( phoneNumbers );

        for ( k=0; k<phoneNumberCount; k++ )
            {
            CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex( phoneNumbers, k );
            CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex( phoneNumbers, k );
            CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel( phoneNumberLabel );    // converts "_$!<Work>!$_" to "work" and "_$!<Mobile>!$_" to "mobile"

            // Find the ones you want here
            //
            NSLog(@"-----PHONE ENTRY -> %@ : %@", phoneNumberLocalizedLabel, phoneNumberValue );

            CFRelease(phoneNumberLocalizedLabel);
            CFRelease(phoneNumberLabel);
            CFRelease(phoneNumberValue);
            }
        }

    [people release];
    CFRelease(addressBook);
    }
person John Carter    schedule 25.11.2010
comment
AlBeebe, К сожалению на девайсе (iPhone 4, 4.2) на это уходит намного больше времени. У меня ушло 15 секунд на адресную книгу 3000) - person Rabih; 25.02.2011
comment
iphone 3GS ios4.2.2 = ›требует больше 40 секунд для 2000 контактов. Это не очень хорошо. - person ChangUZ; 22.09.2011

-(void)createQuickAccessContacts{

    NSMutableDictionary contactDictionary= [[NSMutableDictionary alloc]init];


    CFArrayRef all = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex n = ABAddressBookGetPersonCount(addressBook);

    NSDate *date=[NSDate date];

    for( int i = 0 ; i < n ; i++ )
    {
        ABRecordRef ref = CFArrayGetValueAtIndex(all, i);
        ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue(ref, kABPersonPhoneProperty);

        for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++)
        {

            CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j);
            NSString *phoneNumber = (__bridge NSString *)phoneNumberRef;
            [contactDictionary setObject:(__bridge id)(ref) forKey:phoneNumber];


        }
    }

    NSLog(@" Time taken %f for %i contacts",[[NSDate date] timeIntervalSinceDate:date],[contactDictionary count]);

}

Это занимает около 0,5 секунды для заполнения 2,5 тысяч контактов, после чего вы можете найти контакт по номеру

 ABRecordRef ref= [contactDictionary objectForKey:@"89xxxxxxx"];

его супербыстрая скорость занимает около 0,000x секунд

person Rohit    schedule 21.11.2013

Использовать это. это мой код.

NSLog(@"=====Make People Array with Numbers. Start.");
        peopleWithNumber = [[NSMutableDictionary alloc] init];
        for (int i=0; i < [people count]; i++) {
            NSInteger phoneCount = [self phoneCountAtIndex:i];
            if (phoneCount != 0) {
                NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init];
                for (int j=0 ; j < phoneCount ; j++) {
                    [phoneNumbers addObject:[self phoneNumberAtIndex:i phoneIndex:j]];
                }
                [peopleWithNumber addEntriesFromDictionary:
                 [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSArray arrayWithArray:phoneNumbers],    [self fullNameAtIndex:i], nil]];
            }
        }
        NSLog(@"=====Make People Array with Numbers. End.\n");

метод поиска. это будет быстрее, чем использовать массив

«NSArray * people = (NSArray *) ABAddressBookCopyArrayOfAllPeople (addressBook);»

- (NSArray *)searchNamesByNumber:(NSString *)number {

    NSString *predicateString = [NSString stringWithFormat:@"%@[SELF] contains '%@'",@"%@",number];
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:predicateString,peopleWithNumber,number];
    NSArray *names = [[peopleWithNumber allKeys] filteredArrayUsingPredicate:searchPredicate];

    return names;
}
person ChangUZ    schedule 05.08.2011