kABPersonEmailProperty возвращает странные вещи - PullRequest
8 голосов
/ 12 июля 2011

Я пытаюсь получить адрес электронной почты ABRecordRef следующим образом:

ABRecordRef ref = CFArrayGetValueAtIndex( allPeople, i );
NSString *email = [(NSString*) ABRecordCopyValue( ref, kABPersonEmailProperty ) autorelease];
NSLog(@"%@", email);

Это возвращает это:

_$!<Home>!$_ (0x6840af0) - test@test.com (0x6840cc0)

Что это за письмо? и как от этого избавиться? Спасибо.

Ответы [ 3 ]

31 голосов
/ 12 июля 2011

kABPersonEmailProperty относится к типу kABMultiStringPropertyType. Не существует единого адреса электронной почты, у человека может быть адрес электронной почты для работы, один для дома и т. Д. Вы можете получить массив всех адресов электронной почты, используя ABMultiValueCopyArrayOfAllValues:

ABMultiValueRef emailMultiValue = ABRecordCopyValue(ref, kABPersonEmailProperty);
NSArray *emailAddresses = [(NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue) autorelease];
CFRelease(emailMultiValue);

Чтобы получить метки адресов электронной почты, используйте ABMultiValueCopyLabelAtIndex. «_$!<Home>!$» - это специальная константа, которая определяется как kABHomeLabel, также есть kABWorkLabel.

1 голос
/ 31 августа 2013

В основном больше подробностей для ответа @omz.Вот код, который я использовал, чтобы извлечь домашнюю электронную почту и имя человека:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
    for (CFIndex i = 0; i < ABMultiValueGetCount(emails); i++) {
        NSString *label = (__bridge NSString *) ABMultiValueCopyLabelAtIndex(emails, i);
        if ([label isEqualToString:(NSString *)kABHomeLabel]) {
            NSString *email = (__bridge NSString *) ABMultiValueCopyValueAtIndex(emails, i);
            _emailTextField.text = email;
        }
    }
    CFRelease(emails);


    NSString *first = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *last = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

    if (first && first.length > 0 && last && last.length > 0) {
        _nicknameTextField.text = [NSString stringWithFormat:@"%@ %@", first, last];
    } else if (first && first.length > 0) {
        _nicknameTextField.text = first;
    } else {
        _nicknameTextField.text = last;
    }

    [self dismissModalViewControllerAnimated:YES];

    return NO;
}
0 голосов
/ 12 июля 2011

Попробуйте это ......

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
// Display only a person's phone, email, and birthdate
NSArray *displayedItems = [NSArray arrayWithObjects:
[NSNumber numberWithInt:kABPersonPhoneProperty],
[NSNumber numberWithInt:kABPersonEmailProperty],
[NSNumber numberWithInt:kABPersonBirthdayProperty], nil];
picker.displayedProperties = displayedItems;
...