Адресная книга - выберите электронную почту связанного контакта

StackOverflow https://stackoverflow.com//questions/23060019

Вопрос

Я пытаюсь получить выбранную систему электронной почты в делегатах обратного вызова, упомянутого ниже

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
        if (property==kABPersonEmailProperty) {
            ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
            if (ABMultiValueGetCount(emails) > 0) {
                NSString *email = (__bridge_transfer NSString*)
                ABMultiValueCopyValueAtIndex(emails, ABMultiValueGetIndexForIdentifier(emails,identifier));
                [recipientEmail setText:email];
                [peoplePicker dismissViewControllerAnimated:YES completion:nil];
            }
             CFRelease(emails);
        }
        return NO;
    }
.

Но если я выберу свой свойство электронной почты связанного контакта (наличие единого электронного письма), я получаю идентификатор как 0, в результате я получаю первый адрес электронной почты первичного контакта. Например: John - John@gmail.com john26@gmail.com. Роджер (связанный контакт) - roger@gmail.com

Когда я выбираю roger@gmail.com, я получаю john@gmail.com.

Это было полезно?

Решение

У меня есть такой же проблема.Я получаю неправильную электронную почту, когда я выбираю учетные записи с несколькими адресами электронной почты.Когда я петлю через выбранный ABMutablemultivalueref ...

for (CFIndex ix = 0; ix < ABMultiValueGetCount(emails); ix++) {
   CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, ix);
   CFStringRef value = ABMultiValueCopyValueAtIndex(emails, ix);
   NSLog(@"I have a %@ address: %@", label, value);
   if (label) CFRelease(label);
   if (value) CFRelease(value);
}
.

... Я получаю несколько вхождений одного и того же адреса, но некоторые с нулевыми этикетками.

> I have a (null) address: john@home.com
> I have a _$!<Work>!$_ address: jsmith@work.com
> I have a _$!<Home>!$_ address: john@home.com
.

Обходной путь Я постараюсь сначала отфильтровывать нулевые метки, см. Если подстановки ABMultiveliDiodifier ', а если не вернется к нулевым меткам.Если вы не нашли чего-то?

Редактировать: это работает для меня.

    NSMutableArray *labeled = [NSMutableArray new];
    ABMutableMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
    for (CFIndex ix = 0; ix < ABMultiValueGetCount(emails); ix++) {
        CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, ix);
        CFStringRef value = ABMultiValueCopyValueAtIndex(emails, ix);
        if (label != NULL) {
            [labeled addObject:(NSString *)CFBridgingRelease(value)];
        }
        if (label) CFRelease(label);
        if (value) CFRelease(value);
    }
    NSString *email;
    if (labeled.count > identifier) {
        email = [labeled objectAtIndex:identifier];
    } else {
        CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, identifier);
        email = (NSString *)CFBridgingRelease(emailRef);
    }
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top