从联系人获取所有电子邮件地址(iOS)

我知道有可能拉起一个联系人,并根据一个联系人查看信息。 但是有没有办法从你input电子邮件地址的联系人中获取所有的电子邮件,然后将其存储在NSArray中? 这是我第一次与联系人合作,所以我不太了解。

是的,你可以做到这一点。 你可能想要这样做(为什么你需要这些信息?)似乎是可疑的,但这并不难。

您可以使用ABAddressBookCopyArrayOfAllPeople获取所有人员的CFArrayRef,然后您可以使用ABRecordCopyValue查询每个人的kABPersonEmailProperty 。 代码看起来像这样(未经testing):

 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); 

(内存分配可能有点偏离;自从我开发Cocoa / Core Foundation代码以来已经有一段时间了。)

但严重的是,问你为什么这样做。 通过使用苹果提供的API在适当的时候呈现联系人select器,很有可能会有更好的解决scheme。

 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; } 

对于iOS 9+,请使用联系人框架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; NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; NSError *error; NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate 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;}