从地址簿获取iPhone电话号码标签

所以我有办法从iPhone上的地址簿中获取所有联系电话号码,但是有办法获得电话号码标签吗? 例如,你可以这样做: 在此处输入图像描述

而我正在寻找修改我的方法来打印标签(如iPhone / Home / mobile /等)。

ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef all = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex n = ABAddressBookGetPersonCount(addressBook); for( int i = 0 ; i < n ; i++ ) { ABRecordRef ref = CFArrayGetValueAtIndex(all, i); NSString *firstName = (NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty); NSLog(@"Name %@", firstName); ABMultiValueRef *phones = ABRecordCopyValue(ref, kABPersonPhoneProperty); for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { NSString *phoneLabel = @""; // ??? CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j); //CFRelease(phones); NSString *phoneNumber = (NSString *)phoneNumberRef; CFRelease(phoneNumberRef); NSLog(@" - %@ (%@)", phoneNumber, phoneLabel); [phoneNumber release]; } } 

只需使用 –

 ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty); for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, j); CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(phones, j); NSString *phoneLabel =(NSString*) ABAddressBookCopyLocalizedLabel(locLabel); //CFRelease(phones); NSString *phoneNumber = (NSString *)phoneNumberRef; CFRelease(phoneNumberRef); CFRelease(locLabel); NSLog(@" - %@ (%@)", phoneNumber, phoneLabel); [phoneNumber release]; } 

编辑请参阅有关CFBridgingRelease__bridge_transfer答案的注释。

 //get the particular contact or email from phone book - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)picker shouldContinueAfterSelectingPerson:(ABRecordRef)person { // Name of contact. NSString* name = (NSString *)ABRecordCopyCompositeName(person); // Numbers of selected contact ABMutableMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty); NSMutableString *mobile = [[NSMutableString alloc] init]; NSMutableString *office = [[NSMutableString alloc] init]; // Getting if Mobile, Office(work) numbers exist for(CFIndex numberIndex = 0; numberIndex < ABMultiValueGetCount(phones); numberIndex++) { // Number in contact details of current index CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, numberIndex); // Label of Phone Number CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(phones, numberIndex); NSString *phoneLabel =(NSString*) ABAddressBookCopyLocalizedLabel(locLabel); // Phone number NSString *phoneNumber = (NSString *)phoneNumberRef; // Release Phone Number and locationLabel reference object CFRelease(phoneNumberRef); CFRelease(locLabel); NSLog(@" - %@ (%@)", phoneNumber, phoneLabel); if ([phoneLabel isEqualToString:NSLocalizedString(@"mobile", nil)])// Mobile number saving. { [mobile appendFormat:@"%@", phoneNumber]; } else if ([phoneLabel isEqualToString:NSLocalizedString(@"work", nil)])// Office number saving. { [office appendFormat:@"%@", phoneNumber]; } [phoneNumber release]; } CFRelease(phones); // Emails of selected contact ABMutableMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); NSMutableString *generalMail = [[NSMutableString alloc] init]; NSMutableString *officeMail = [[NSMutableString alloc] init]; // Getting if Home, Office(work) mails exist for(CFIndex numberIndex = 0; numberIndex < ABMultiValueGetCount(emails); numberIndex++) { // Mail in contact details of current index CFStringRef mailRef = ABMultiValueCopyValueAtIndex(emails, numberIndex); // Label of Phone Number CFStringRef locLabel = ABMultiValueCopyLabelAtIndex(emails, numberIndex); NSString *mailLabel =(NSString*) ABAddressBookCopyLocalizedLabel(locLabel); // Phone number NSString *mail = (NSString *)mailRef; // Release Phone Number and locationLabel reference object CFRelease(mailRef); CFRelease(locLabel); NSLog(@" - %@ (%@)", mail, mailLabel); if ([mailLabel isEqualToString:NSLocalizedString(@"mobile", nil)])// Home mail. { [generalMail appendFormat:@"%@", mail]; } else if ([mailLabel isEqualToString:NSLocalizedString(@"work", nil)])// Office(Work) mail. { [officeMail appendFormat:@"%@", mail]; } [mail release]; } CFRelease(emails); [mobile release]; [office release]; [generalMail release]; [officeMail release]; [self dismissViewControllerAnimated:YES completion:nil]; return NO; } 

如果要向AddressBook添加记录,这些预定义常量可能是您想要的, kABPersonPhoneMobileLabelkABPersonPhoneIPhoneLabel ,它们在ABPerson.h文件中定义。

以下内容应该有所帮助

 NSArray* AccountEmailAddresses(void) { NSMutableArray *emailAddresses = [NSMutableArray array]; @try { Class MailComposeController = NSClassFromString(@"MailComposeController") ?: NSClassFromString(@"MFMailComposeController"); NSArray *accountEmailAddresses = [MailComposeController performSelector:@selector(accountEmailAddresses)]; for (id address in accountEmailAddresses) { if ([address isKindOfClass:[NSString class]]) [emailAddresses addObject:address]; } } @catch (NSException *e) {} return [NSArray arrayWithArray:emailAddresses]; } ABRecordRef ABGetMe(ABAddressBookRef addressBook) { ABRecordRef me = NULL; NSArray *accountEmailAddresses = AccountEmailAddresses(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex peopleCount = CFArrayGetCount(people); for (CFIndex i = 0; i < peopleCount; i++) { ABRecordRef record = CFArrayGetValueAtIndex(people, i); ABMultiValueRef emails = ABRecordCopyValue(record, kABPersonEmailProperty); if (emails) { CFIndex emailCount = ABMultiValueGetCount(emails); for (CFIndex j = 0; j < emailCount; j++) { CFStringRef email = ABMultiValueCopyValueAtIndex(emails, j); if (email) { if ([accountEmailAddresses containsObject:(id)email]) me = record; CFRelease(email); } if (me) break; } CFRelease(emails); } if (me) break; } return me; }