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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 19:18:09  来源:igfitidea点击:

Get iPhone phone number label from Address Book

iphoneobjective-ciosabaddressbookphone-number

提问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: enter image description here

所以我有一种方法可以从 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 CFBridgingReleaseand __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;
}