Obtenga la label de número de teléfono de iPhone desde la Libreta de direcciones

Entonces tengo un método para get todos los numbers de teléfono de contacto de la libreta de direcciones en el iPhone, pero ¿hay alguna forma de get la label de número de teléfono? Por ejemplo, puedes hacer esto: introduzca la descripción de la imagen aquí

Y estaría buscando modificar mi método para imprimir la label (como iPhone / Home / mobile / etc).

ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef all = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex n = ABAddressBookGetPersonCount(addressBook); for( int i = 0 ; i < n ; i++ ) { ABRecordRef ref = CFArrayGetValueAtIndex(all, i); NSString *firstName = (NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty); NSLog(@"Name %@", firstName); ABMultiValueRef *phones = ABRecordCopyValue(ref, kABPersonPhoneProperty); for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { NSString *phoneLabel = @""; // ??? CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j); //CFRelease(phones); NSString *phoneNumber = (NSString *)phoneNumberRef; CFRelease(phoneNumberRef); NSLog(@" - %@ (%@)", phoneNumber, phoneLabel); [phoneNumber release]; } } 

    Simplemente usa –

     ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty); for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j); CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(phones, j); NSString *phoneLabel =(NSString*) ABAddressBookCopyLocalizedLabel(locLabel); //CFRelease(phones); NSString *phoneNumber = (NSString *)phoneNumberRef; CFRelease(phoneNumberRef); CFRelease(locLabel); NSLog(@" - %@ (%@)", phoneNumber, phoneLabel); [phoneNumber release]; } 

    EDITAR Vea las notas de esta respuesta sobre CFBridgingRelease y __bridge_transfer .

     //get the particular contact or email from phone book - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)picker shouldContinueAfterSelectingPerson:(ABRecordRef)person { // Name of contact. NSString* name = (NSString *)ABRecordCopyCompositeName(person); // Numbers of selected contact ABMutableMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty); NSMutableString *mobile = [[NSMutableString alloc] init]; NSMutableString *office = [[NSMutableString alloc] init]; // Getting if Mobile, Office(work) numbers exist for(CFIndex numberIndex = 0; numberIndex < ABMultiValueGetCount(phones); numberIndex++) { // Number in contact details of current index CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, numberIndex); // Label of Phone Number CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(phones, numberIndex); NSString *phoneLabel =(NSString*) ABAddressBookCopyLocalizedLabel(locLabel); // Phone number NSString *phoneNumber = (NSString *)phoneNumberRef; // Release Phone Number and locationLabel reference object CFRelease(phoneNumberRef); CFRelease(locLabel); NSLog(@" - %@ (%@)", phoneNumber, phoneLabel); if ([phoneLabel isEqualToString:NSLocalizedString(@"mobile", nil)])// Mobile number saving. { [mobile appendFormat:@"%@", phoneNumber]; } else if ([phoneLabel isEqualToString:NSLocalizedString(@"work", nil)])// Office number saving. { [office appendFormat:@"%@", phoneNumber]; } [phoneNumber release]; } CFRelease(phones); // Emails of selected contact ABMutableMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); NSMutableString *generalMail = [[NSMutableString alloc] init]; NSMutableString *officeMail = [[NSMutableString alloc] init]; // Getting if Home, Office(work) mails exist for(CFIndex numberIndex = 0; numberIndex < ABMultiValueGetCount(emails); numberIndex++) { // Mail in contact details of current index CFStringRef mailRef = ABMultiValueCopyValueAtIndex(emails, numberIndex); // Label of Phone Number CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(emails, numberIndex); NSString *mailLabel =(NSString*) ABAddressBookCopyLocalizedLabel(locLabel); // Phone number NSString *mail = (NSString *)mailRef; // Release Phone Number and locationLabel reference object CFRelease(mailRef); CFRelease(locLabel); NSLog(@" - %@ (%@)", mail, mailLabel); if ([mailLabel isEqualToString:NSLocalizedString(@"mobile", nil)])// Home mail. { [generalMail appendFormat:@"%@", mail]; } else if ([mailLabel isEqualToString:NSLocalizedString(@"work", nil)])// Office(Work) mail. { [officeMail appendFormat:@"%@", mail]; } [mail release]; } CFRelease(emails); [mobile release]; [office release]; [generalMail release]; [officeMail release]; [self dismissViewControllerAnimated:YES completion:nil]; return NO; } 

    Si está agregando loggings a la Libreta de direcciones, estas constantes pnetworkingefinidas pueden ser lo que desea, kABPersonPhoneMobileLabel , kABPersonPhoneIPhoneLabel , que se definen en el file ABPerson.h.

    lo siguiente debería ayudar:

     NSArray* AccountEmailAddresses(void) { NSMutableArray *emailAddresses = [NSMutableArray array]; @try { Class MailComposeController = NSClassFromString(@"MailComposeController") ?: NSClassFromString(@"MFMailComposeController"); NSArray *accountEmailAddresses = [MailComposeController performSelector:@selector(accountEmailAddresses)]; for (id address in accountEmailAddresses) { if ([address isKindOfClass:[NSString class]]) [emailAddresses addObject:address]; } } @catch (NSException *e) {} return [NSArray arrayWithArray:emailAddresses]; } ABRecordRef ABGetMe(ABAddressBookRef addressBook) { ABRecordRef me = NULL; NSArray *accountEmailAddresses = AccountEmailAddresses(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex peopleCount = CFArrayGetCount(people); for (CFIndex i = 0; i < peopleCount; i++) { ABRecordRef record = CFArrayGetValueAtIndex(people, i); ABMultiValueRef emails = ABRecordCopyValue(record, kABPersonEmailProperty); if (emails) { CFIndex emailCount = ABMultiValueGetCount(emails); for (CFIndex j = 0; j < emailCount; j++) { CFStringRef email = ABMultiValueCopyValueAtIndex(emails, j); if (email) { if ([accountEmailAddresses containsObject:(id)email]) me = record; CFRelease(email); } if (me) break; } CFRelease(emails); } if (me) break; } return me; }