Получить ярлык номера телефона iPhone из адресной книги

Итак, у меня есть способ получить все контактные телефоны из адресной книги на iPhone, но есть ли способ получить номер телефона? Например, вы можете сделать это: enter image description here

И я бы хотел изменить свой метод для печати ярлыка (например, 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];
    }
}
15
задан ingh.am 20 марта '11 в 18:30
источник поделиться
4 ответов

Просто используйте -

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.

60
ответ дан shannoga 20 марта '11 в 19:16
источник поделиться
//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;
}
3
ответ дан abhi 23 июля '13 в 13:45
источник поделиться

Если вы добавляете записи в AddressBook, эти предопределенные константы могут быть такими, какие вы хотите, kABPersonPhoneMobileLabel, kABPersonPhoneIPhoneLabel, которые определены в файле ABPerson.h.

0
ответ дан Dawn Song 25 дек. '15 в 12:11
источник поделиться

следующее должно помочь:

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;
}
-4
ответ дан reflog 20 марта '11 в 19:22
источник поделиться

Другие вопросы по меткам