ios 从地址簿获取 iPhone 电话号码标签
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5369423/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get iPhone phone number label from Address Book
提问by ingh.am
So I have a method to get all the contact phone numbers from the address book on the iPhone, but is there a way to get the phone number label? For example you can do this:
所以我有一种方法可以从 iPhone 上的通讯录中获取所有联系电话号码,但是有没有办法获取电话号码标签?例如,您可以这样做:
And I'd be looking to modify my method to print out the label (such as iPhone/Home/mobile/etc).
我希望修改我的方法来打印标签(例如 iPhone/Home/mobile/etc)。
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];
}
}
回答by shannoga
Simply use -
只需使用 -
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];
}
EDITPlease see the notes for this answer about CFBridgingRelease
and __bridge_transfer
.
编辑请参阅此答案的注释关于CFBridgingRelease
和__bridge_transfer
。
回答by abhi
//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;
}
回答by DawnSong
If you are adding records to the AddressBook, these predefined constants may be what you want, kABPersonPhoneMobileLabel
, kABPersonPhoneIPhoneLabel
, which are defined in the file ABPerson.h.
如果您要向地址簿添加记录,这些预定义的常量可能就是您想要的,kABPersonPhoneMobileLabel
, kABPersonPhoneIPhoneLabel
,它们在文件 ABPerson.h 中定义。
回答by reflog
the following should help:
以下应该有所帮助:
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;
}