Obtenga todas las direcciones de correo electrónico de contactos (iOS)

Sé que es posible abrir un contacto y ver información basada en un contacto. Pero, ¿hay alguna forma de get todos los correos electrónicos de los contactos para los que ha ingresado direcciones de correo electrónico y luego almacenarlos en un NSArray? Esta es la primera vez que trabajo con contactos, así que no sé mucho al respecto.

Sí, usted puede hacer esto. Parece sospechoso que querrías hacer esto (¿por qué necesitas esta información?), Pero no es difícil hacerlo.

Puede usar ABAddressBookCopyArrayOfAllPeople para get un CFArrayRef con todas las personas, y luego puede consultar kABPersonEmailProperty de cada uno utilizando ABRecordCopyValue . El código se vería así (no probado):

 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); NSMutableArray *allEmails = [[NSMutableArray alloc] initWithCapacity:CFArrayGetCount(people)]; for (CFIndex i = 0; i < CFArrayGetCount(people); i++) { ABRecordRef person = CFArrayGetValueAtIndex(people, i); ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); for (CFIndex j=0; j < ABMultiValueGetCount(emails); j++) { NSString* email = (NSString*)ABMultiValueCopyValueAtIndex(emails, j); [allEmails addObject:email]; [email release]; } CFRelease(emails); } CFRelease(addressBook); CFRelease(people); 

(La asignación de memory puede estar un poco apagada; ha pasado un time desde que desarrollé el código de Fundación Cocoa / Core.)

Pero en serio, pregunta por qué estás haciendo esto. Existe una buena posibilidad de que haya una mejor solución simplemente utilizando las API proporcionadas por Apple para presentar un selector de contactos en los momentos apropiados.

 ABAddressBookRef allPeople = ABAddressBookCreate(); CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(allPeople); CFIndex numberOfContacts = ABAddressBookGetPersonCount(allPeople); NSLog(@"numberOfContacts------------------------------------%ld",numberOfContacts); for(int i = 0; i < numberOfContacts; i++){ NSString* name = @""; NSString* phone = @""; NSString* email = @""; ABRecordRef aPerson = CFArrayGetValueAtIndex(allContacts, i); ABMultiValueRef fnameProperty = ABRecordCopyValue(aPerson, kABPersonFirstNameProperty); ABMultiValueRef lnameProperty = ABRecordCopyValue(aPerson, kABPersonLastNameProperty); ABMultiValueRef phoneProperty = ABRecordCopyValue(aPerson, kABPersonPhoneProperty);\ ABMultiValueRef emailProperty = ABRecordCopyValue(aPerson, kABPersonEmailProperty); NSArray *emailArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty); NSArray *phoneArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneProperty); if (fnameProperty != nil) { name = [NSString stringWithFormat:@"%@", fnameProperty]; } if (lnameProperty != nil) { name = [name stringByAppendingString:[NSString stringWithFormat:@" %@", lnameProperty]]; } if ([phoneArray count] > 0) { if ([phoneArray count] > 1) { for (int i = 0; i < [phoneArray count]; i++) { phone = [phone stringByAppendingString:[NSString stringWithFormat:@"%@\n", [phoneArray objectAtIndex:i]]]; } }else { phone = [NSString stringWithFormat:@"%@", [phoneArray objectAtIndex:0]]; } } if ([emailArray count] > 0) { if ([emailArray count] > 1) { for (int i = 0; i < [emailArray count]; i++) { email = [email stringByAppendingString:[NSString stringWithFormat:@"%@\n", [emailArray objectAtIndex:i]]]; } }else { email = [NSString stringWithFormat:@"%@", [emailArray objectAtIndex:0]]; } } NSLog(@"NAME : %@",name); NSLog(@"PHONE: %@",phone); NSLog(@"EMAIL: %@",email); NSLog(@"\n"); } 
 @import AddressBook; - (void)addressBookInit { if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied || ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted){ // NSLog(@"Denied"); UIAlertView *cantAddContactAlert = [[UIAlertView alloc] initWithTitle: @"Cannot get contacts" message: @"You must give the app permission to read the contacts first." delegate:nil cancelButtonTitle: @"OK" otherButtonTitles: nil]; [cantAddContactAlert show]; } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){ // NSLog(@"Authorized"); [self getEmails]; } else { // NSLog(@"Not determined"); ABAddressBookRequestAccessWithCompletion(ABAddressBookCreateWithOptions(NULL, nil), ^(bool granted, CFErrorRef error) { dispatch_async(dispatch_get_main_queue(), ^{ if (!granted){ //4 UIAlertView *cantAddContactAlert = [[UIAlertView alloc] initWithTitle: @"Cannot get contacts" message: @"You must give the app permission to read the contacts first." delegate:nil cancelButtonTitle: @"OK" otherButtonTitles: nil]; [cantAddContactAlert show]; return; } // NSLog(@"Authorized 2"); [self getEmails]; }); }); } } -(NSArray *)getEmails { NSMutableArray *emails = [NSMutableArray array]; ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil); NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBookRef); for (id record in allContacts) { ABRecordRef person = (__bridge ABRecordRef)record; ABMultiValueRef emailProperty = ABRecordCopyValue(person, kABPersonEmailProperty) ; NSArray *personEmails = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty); [emails addObjectsFromArray:personEmails]; CFRelease(person); CFRelease(emailProperty); } CFRelease(addressBookRef) ; for (NSString *email in emails) { NSLog(@"%@", email) ; } return emails; } 

para iOS 9+, use el marco de contactos, el objective C

 -(NSArray*)getAllContacts{ __block NSMutableArray *allContacts = nil; CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted == YES) { //keys with fetching properties NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactEmailAddressesKey, CNContactImageDataKey]; NSString *containerId = store.defaultContainerIdentifier; NSPnetworkingicate *pnetworkingicate = [CNContact pnetworkingicateForContactsInContainerWithIdentifier:containerId]; NSError *error; NSArray *cnContacts = [store unifiedContactsMatchingPnetworkingicate:pnetworkingicate keysToFetch:keys error:&error]; if (error) { NSLog(@"error fetching contacts %@", error); } else { allContacts = [NSMutableArray array]; for (CNContact *contact in cnContacts) { // copy data to my custom Contacts class. // create custom class Contacts with firstName,lastName,image and emailAddress for (CNLabeledValue<NSString*> *email in contact.emailAddresses) { Contact *newContact = [[Contact alloc] init]; newContact.firstName = contact.givenName; newContact.lastName = contact.familyName; UIImage *image = [UIImage imageWithData:contact.imageData]; newContact.image = image; newContact.emailAddress = email.value; [allContacts addObject:newContact]; } } } } }]; return allContacts;}