2010-11-24 2 views
10

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

ответ

18

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

- (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); 
    } 
+2

AlBeebe, К сожалению, на устройстве требуется гораздо больше времени (iPhone 4, 4.2). Я взял 15 секунд для адресной книги 3000) – Rabih 2011-02-25 12:39:15

-1

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

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 (адресная книга);"

- (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; 
} 
5
-(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.5K контактов заполнить , то вы можете найти контакт, используя номер

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

его супер быстро принимает как 0.000x секунд

Смежные вопросы