peoplePickerNavigationController: shouldContinueAfterSelectingPerson: propiedad: identificador:

Estoy tratando de get el número de teléfono mobile seleccionado con

ABMultiValueRef phones = ABRecordCopyValue(person, property); CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, identifier); 

Tengo un contacto con varios teléfonos mobilees (todos labeldos como 'mobile'). Cuando selecciono el primero, phoneNumber me da el primero, pero si selecciono uno consecutivo, phoneNumber me da el número anterior:

Contacto: Jay Jaymes mobile +1111111111 mobile +2222222222 mobile +3333333333

Toque primero uno, phoneNumber = +1111111111

Toque el segundo uno, phoneNumber = +1111111111

Toque el tercero, phoneNumber = +2222222222

Este es el código que uso. Y le dará el número de teléfono correcto solamente

  - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { if (property == kABPersonPhoneProperty) { ABMultiValueRef phoneProperty = ABRecordCopyValue(person,property); CFIndex peopleIndex = ABMultiValueGetIndexForIdentifier(property, identifier); NSString *phone = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneProperty, peopleIndex); [self dismissModalViewControllerAnimated:YES]; } return NO; } 

Puedes repetir fácilmente así. Prueba NSLoging ese código para asegurarte de que funcione. Creo que tienes algunos errores en tu "elección" lógica.

 ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty); for (CFIndex i=0; i < ABMultiValueGetCount(phones); i++) { NSString* phoneLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); NSString* phoneNumber = ABMultiValueCopyValueAtIndex(phones, i); //release variables since you were using COPY !!! CFRelease(phoneNumber); CFRelease(phoneLabel); } CFRelease(phones); 

Terminé implementándolo de esta manera:

 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { if (property == kABPersonPhoneProperty) { ABMultiValueRef phones = ABRecordCopyValue(person, property); CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, identifier); NSLog(@"%@", phoneNumber); NSMutableString *tmp = [NSMutableString stringWithFormat:@"%@", (__bridge_transfer NSString *)phoneNumber]; NSString *strippedPhoneNumber = [tmp stringByReplacingOccurrencesOfString:@" " withString:@""]; NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"()-"]; strippedPhoneNumber = [[strippedPhoneNumber componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); [peoplePicker dismissViewControllerAnimated:YES completion:nil]; return NO; } 

No debe utilizar el identifier como el índice dentro de ABMultiValueCopyValueAtIndex . Debe llamar a ABMultiValueGetIndexForIdentifier para convertir el identificador ABMultiValueIdentifier en un índice CFIndex :

 ABMultiValueRef phones = ABRecordCopyValue(person, property); CFIndex index = ABMultiValueGetIndexForIdentifier(phones, identifier); NSString *phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, index)); CFRelease(phones); 

En general, los valores ABMultiValueIdentifier coinciden con los valores CFIndex recuperados por ABMultiValueGetIndexForIdentifier , pero si se editó un contacto (específicamente si se eliminó uno de los numbers de teléfono anteriores), usar el ABMultiValueIdentifier en ABMultiValueCopyValueAtIndex devolverá el logging incorrecto.