2010-08-23 7 views
5

J'utilise le code suivant pour définir le récupérer le numéro de téléphone dans mon application.Comment récupérer des numéros de téléphone mobile à partir de contacts iPhone.

CFStringRef addressBookMobile; 
ABRecordRef person; 
NSString *mobile; 

person = CFArrayGetValueAtIndex(people, i); 
addressBookMobile = ABRecordCopyValue(person, kABPersonPhoneProperty); 
mobile = [NSString stringWithFormat:@"%@", addressBookMobile]; 

La balise des contacts est 'mobile'. Cependant, quand j'utilise le NSLog(@"%@", mobile);. Il affiche le <NSCFType: 0x802ffc0>. a un problème avec mon code?

Devrais-je utiliser le const CFStringRef kABPersonPhoneMobileLabel et comment l'utiliser? Comme si je le remplace comme le code ci-dessus, il a l'erreur. Quelqu'un peut-il m'aider? Je vous remercie.

Répondre

2
ABMultiValueRef phoneNumbers = (NSString *)ABRecordCopyValue(person, kABPersonPhoneProperty); 
CRStringRef mobileNumber; 
CRStringRef mobileLabel; 
for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) { 
    mobileLabel = ABMultiValueCopyLabelAtIndex(phoneNumbers, i); 
    if ([mobileLabel isEqualToString:@"_$!<Mobile>!$_"]) { 
     mobileNumber = ABMultiValueCopyValueAtIndex(phoneNumbers,i); 
     break; 
    } 
} 
5

Les numéros de téléphone d'une personne dans le carnet d'adresses prennent la forme d'une propriété à valeurs multiples.

Dans votre cas, vous devriez avoir quelque chose comme ce qui suit (ont pas essayé, en tapant directement ici, donc je ne sais pas si elle compile et/ou travaux):

ABMultiValueRef phoneNumbers = (NSString *)ABRecordCopyValue(person, kABPersonPhoneProperty); 
NSString *mobileNumber; 
NSString *mobileLabel; 
for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) { 
    mobileLabel = (NSString *)ABMultiValueCopyLabelAtIndex(mobilePhones, i); 
    if ([mobileLabel isEqualToString:@"mobile"]) { 
     mobileNumber = (NSString*)ABMultiValueCopyValueAtIndex(mobilePhones,i); 
     break; 
    } 
} 
+0

Iancu, je vous remercie de votre réponse. Mais je trouve que la solution peut être incorrecte. le résultat est le même et je veux demander, quel est le mobilePhones dans le code? Je vous remercie. – Questions

+0

Désolé Marc, ça aurait du être phoneNumbers :-). Comme je l'ai dit, je l'ai tapé directement dans le formulaire, pas dans Xcode :-). Donc, au lieu de mobilePhones, remplacez par phoneNumbers et il devrait être tout bon. –

16

vérifiez le ABPerson Refrence et vous ne devez pas utiliser @ "$ !! $" mais kABPersonPhoneMobileLabel. l'exemple est:

ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue(person, kABPersonPhoneProperty); 
    NSString* [email protected]""; 
    NSString* mobileLabel; 
    for (int i=0; i < ABMultiValueGetCount(phones); i++) { 
     //NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phones, i); 
     //NSLog(@"%@", phone); 
     mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); 
     if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { 
      NSLog(@"mobile:"); 
     } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { 
      NSLog(@"iphone:"); 
     } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhonePagerLabel]) { 
      NSLog(@"pager:"); 
     } 
     [mobile release]; 
     mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); 
     NSLog(@"%@", mobile); 
    } 
+0

pourquoi il me montre l'erreur sur cette ligne ABMultiValueRef phones = (ABMultiValueRef) ABRecordCopyValue (personne, kABPersonPhoneProperty); NSString * mobile = @ ""; dit une personne non déclarée. J'utilise ios 5 – user2189388

0

Ce solide pour ARC 64bit iOS8:

- (NSArray *)phoneNumbersOfContactAsStrings:(ABRecordRef)contactRef { 

NSMutableArray *mobilePhones = [NSMutableArray arrayWithCapacity:0]; 

ABMultiValueRef phones = ABRecordCopyValue(contactRef, kABPersonPhoneProperty); 
NSArray *allPhoneNumbers = (NSArray *)CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(phones)); 

for (NSUInteger i=0; i < [allPhoneNumbers count]; i++) { 
    if ([(NSString *)CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, (long)i)) isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { 
     [mobilePhones addObject:CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, (long)i))]; 
    } 
    if ([(NSString *)CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, (long)i)) isEqualToString:(NSString *)kABPersonPhoneIPhoneLabel]) { 
     [mobilePhones addObject:CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, (long)i))]; 
    } 
} 

CFRelease(phones); 
return mobilePhones; 
} 
Questions connexes