iphone - telefono - ¿Cómo se obtiene el número de teléfono de una persona de la libreta de direcciones?
cómo cambiar el número de teléfono de icloud (7)
Deberías poder hacer lo siguiente:
ABMultiValueRef phoneNumbers = (ABMultiValueRef)ABRecordCopyValue(person, kABPersonPhoneProperty);
CFRelease(phoneNumbers);
NSString* phoneNumber = (NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
Por supuesto, eso solo le dará el primer número de (potencialmente) muchos asociados con la persona que ha sido seleccionada.
Todo lo que quiero hacer es permitir que el usuario seleccione un número de la libreta de direcciones. Encontré el código en esta pregunta:
Cómo obtener un número de teléfono de un contacto de la libreta de direcciones (iPhone SDK)
ABMultiValueRef container = ABRecordCopyValue(person, property);
CFStringRef contactData = ABMultiValueCopyValueAtIndex(container, identifier);
CFRelease(container);
NSString *contactString = [NSString stringWithString:(NSString *)contactData];
CFRelease(contactData);
El problema es que en la segunda línea (cuando se ejecuta en un dispositivo 3.0) me aparece el siguiente error:
El administrador de cuentas no pudo encontrar una cuenta con el identificador MobileMe: rustyshelf
seguido por:
Señal recibida del programa: "EXC_BAD_ACCESS".
Todo esto está dentro del método del delegado de selección:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
Este es solo uno de los contactos en mi libreta de direcciones, que se sincroniza con Mobile Me
Edit: creo que esto podría ser un error con el SDK, sucede para algunos de mis contactos pero no para otros ...
El argumento "identificador" no contiene el índice de CF del registro tocado. El método que utilizo para indicar qué número de teléfono seleccionó un usuario es este:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
if (property == kABPersonPhoneProperty) {
ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty);
for(CFIndex i = 0; i < ABMultiValueGetCount(multiPhones); i++) {
if(identifier == ABMultiValueGetIdentifierAtIndex (multiPhones, i)) {
CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i);
CFRelease(multiPhones);
NSString *phoneNumber = (NSString *) phoneNumberRef;
CFRelease(phoneNumberRef);
txtPhoneNumber.text = [NSString stringWithFormat:@"%@", phoneNumber];
[phoneNumber release];
}
}
}
[self dismissModalViewControllerAnimated:YES];
return NO;
}
Lo uso para extraer el número de teléfono móvil de un ABRecordRef / La variable "grabar" es el ABRecordRef para el que desea el número de teléfono. Donde tengo "" puede usar otra cadena de etiquetas de teléfono para encontrar otros tipos de números de teléfono.
//Get mobile phone number
ABMultiValueRef phones =(NSString*)ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString* mobile=@"";
NSString* mobileLabel;
for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) {
mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i);
if([mobileLabel isEqualToString:@"_$!<Mobile>!$_"]) {
mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
}
}
Partiendo de la respuesta de Dan:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
{
if (property == kABPersonPhoneProperty) { // if tapped is equal to a phone property
CFStringRef cfnumber;
ABMultiValueRef numbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
for(CFIndex i = 0; i < ABMultiValueGetCount(numbers); i++) {
if(identifier == ABMultiValueGetIdentifierAtIndex (numbers, i)) { //if tapped number identifier is the same as identifier number tapped
cfnumber = ABMultiValueCopyValueAtIndex(numbers, i); // copy the number to CFSTRING number
}
}
NSString *number = [NSString stringWithFormat:@"%@",cfnumber];
CFRelease(cfnumber);
//do anything you want with the number
}
return NO;
}
No te puedo decir si es la mejor / forma correcta. Pero me encontré con algunos errores al usar el código de Dan ... por lo tanto, decidí compartirlo después de averiguarlo. Sigo aprendiendo objetivo c .. jaja .. Espero que ayude ..
Saludos, Steve0hh
Saliendo de la respuesta de JWD, aquí hay una versión más segura que usa las constantes integradas y elige el número de iPhone sobre otro número de móvil ...
ABMultiValueRef phones =(NSString*)ABRecordCopyValue(person, kABPersonPhoneProperty);
NSString* mobile=@"";
NSString* mobileLabel;
for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) {
mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i);
if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel])
{
[mobile release] ;
mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
}
else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel])
{
[mobile release] ;
mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);
break ;
}
}
También puede usar este "ABMultiValueGetIndexForIdentifier" como en este código:
ABPropertyType pt = ABPersonGetTypeOfProperty(property);
NSString *phoneNumber;
if ((pt & kABMultiValueMask) == kABMultiValueMask) {
ABMultiValueRef phoneProperty = ABRecordCopyValue(person,property);
CFIndex idx = ABMultiValueGetIndexForIdentifier(phoneProperty, identifier);
phoneNumber = (NSString *)ABMultiValueCopyValueAtIndex(phoneProperty,idx);
CFRelease(phoneProperty);
}
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
{
if (property == kABPersonPhoneProperty)
{
ABMultiValueRef numbers = ABRecordCopyValue(person, property);
NSString* targetNumber = (__bridge NSString *) ABMultiValueCopyValueAtIndex(numbers, ABMultiValueGetIndexForIdentifier(numbers, identifierForValue));
NSLog(@"%@", targetNumber);
}
return NO;
}
Utilicé esta pregunta para construir mi propia solución. El código que estoy publicando no pretende ser una respuesta, simplemente para que alguien lo encuentre útil. Estos son los pasos simples para obtener una propiedad. Gestión de memoria excluida.