iOS Obtener la dirección de correo electrónico de los contactos seleccionados en la matriz

Lo que trato de hacer es mostrar al selector de personas al usuario, hacer que select todos los contactos que desee y, finalmente, get todas las direcciones de correo electrónico de esos contactos en una matriz. Lo mejor sería mostrar solo contactos con el correo electrónico para el usuario.

Hasta ahora, lo único que he podido hacer es presentar al selector de personas este código:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; [self presentModalViewController:picker animated:YES]; 

Entonces estaba tratando de usar este código para get el correo electrónico de los contactos seleccionados:

 - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); [email addObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(multi, 0)]; [self dismissModalViewControllerAnimated:YES]; return YES; } 

Pero el selector se va tan pronto como selecciono un contacto, así que no sé cómo continuar. Además, justo cuando selecciono un contacto obtengo esto en la console:

 "Unbalanced calls to begin/end appearance transitions for <ABMembersViewController: 0xa1618c0>." 

Cualquier ayuda sería apreciada.

No estoy seguro si alguna vez solucionó su problema, pero si alguien más encuentra esta publicación, tal vez les ayude. Lo que hice para get un correo electrónico del ABPeoplePickerNavigationController fue eliminar

 [self dismissModalViewControllerAnimated:YES]; 

de

 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person; 

y luego estoy usando esto para get el correo electrónico y descartar el controller

 - (BOOL)peoplePickerNavigationController(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { if (kABPersonEmailProperty == property) { ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); NSString *email = (__bridge NSString *)ABMultiValueCopyValueAtIndex(multi, 0); NSLog(@"email: %@", email); [self dismissModalViewControllerAnimated:YES]; return NO; } return YES; } 

Permite al usuario seleccionar un correo electrónico específico y descarta el controller sin ningún error.

Por lo que puedo decir, esto en realidad no te dará la dirección de correo electrónico que se seleccionó. Si un contacto tiene correos electrónicos "domésticos" y "de trabajo", entonces ABMultiValueCopyValueAtIndex(multi, 0) simplemente le dará el correo electrónico de "inicio".

Debe get el índice para el correo electrónico seleccionado del identificador.

 - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { if (property == kABPersonEmailProperty) { ABMultiValueRef emails = ABRecordCopyValue(person, property); CFIndex ix = ABMultiValueGetIndexForIdentifier(emails, identifier); CFStringRef email = ABMultiValueCopyValueAtIndex(emails, ix); [self dismissViewControllerAnimated:YES completion:nil]; [self callMethodWithEmailString:(__bridge NSString *)(email)]; if (email) CFRelease(email); if (emails) CFRelease(emails); } return NO; } 

Preguntas relacionadas:

  • ¿Cómo recibir un correo electrónico usando ABPeoplePicker?
  • ¿Cómo obtengo una dirección de correo electrónico seleccionada por el usuario de ABPeoplePicker?