2010-11-24 5 views
10

Je développe une application qui se connecte à un autre iphone en utilisant bonjour. Une de ses caractéristiques est quand je me connecte à l'autre appareil, il va vérifier automatiquement si j'ai le numéro de téléphone d'autres personnes. Donc, mon problème est comment puis-je vérifier mon carnet d'adresses pour le numéro de téléphone fourni par l'autre appareil?Comment rechercher dans le carnet d'adresses iphone un numéro de téléphone spécifique?

Répondre

18

Voici un exemple extrait d'une de mes méthodes de carnet d'adresses. Je ne cherchais pas par numéro de téléphone, mais cela vous donne une idée de comment aller de l'avant avec ce dont vous avez besoin:

- (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, Malheureusement, cela prend beaucoup plus de temps sur un appareil (iPhone 4, 4.2). J'ai pris 15 secondes pour un carnet d'adresses de 3000) – Rabih

+0

iphone 3GS ios4.2.2 => prend plus de 40sec pour 2000 contacts.it n'est pas bon. – ChangUZ

+0

Merci beaucoup, excellent travail – wod

-1

Utilisez ceci. c'est mon code.

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"); 

méthode de recherche. il serait plus rapide que d'utiliser le tableau

"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; 
} 
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]); 

} 

Cela prend comme 0,5 s pour 2.5k contacts pour remplir alors vous pouvez trouver le numéro à l'aide de contact

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

son super rapide prend comme 0.000x secondes

Questions connexes