ios - 当联系人具有 LinkedContacts 时,ABMultiValueGetIndexForIdentifier 返回不正确的索引

标签 ios objective-c abaddressbook abmultivalue

我注意到我们用来处理由 ABPeoplePickerNavigationController 提供的联系人选择特定电子邮件的逻辑中的一个错误。当我们的联系人具有来自 Twitter 或 Facebook 的链接联系人时,就会出现此错误。

我已经根据几个相关的 StackOverflow 问题仔细检查了我们的逻辑,我似乎“正确地”做了所有事情:

下面是点击按钮后加载 ABPeoplePicker 的代码:

- (void)setUpChooseContactButton
{
    @weakify(self)
    [self.chooseContactButton addEventHandler:^(id sender) {

        @strongify(self)
        ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
        picker.peoplePickerDelegate = self;
        picker.displayedProperties = @[@(kABPersonEmailProperty)];

        picker.delegate = self;

        [self presentViewController:picker animated:YES completion:nil];

    } forControlEvents:UIControlEventTouchUpInside];
}

稍后,当用户点击所选联系人的电子邮件时,我们会按如下方式处理:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier
{
    if (property == kABPersonEmailProperty)
    {
        ABMultiValueRef multiEmail = ABRecordCopyValue(person, kABPersonEmailProperty);
        CFIndex selectedIndex = ABMultiValueGetIndexForIdentifier(multiEmail, identifier);
        CFStringRef selectedEmail = ABMultiValueCopyValueAtIndex(multiEmail, selectedIndex);
        NSLog(@"Doing something with %@", selectedEmail);
        if (selectedEmail) CFRelease(selectedEmail);
        if (multiEmail) CFRelease(multiEmail);
    }

    [self dismissViewControllerAnimated:YES completion:nil];

    return NO;
}

当联系人没有任何链接的联系人时,这非常有效,例如然而,Facebook 这样做时,打印在此处的电子邮件地址将不是用户选择的地址。

例如,我的联系人中有一个 friend ,我们称他为 John Snow,我们是好 friend ,所以我通过 iCloud、2 个不同的 gmail 帐户和 Facebook 与他联系.

当我导航到 John Snow 的联系页面时,我看到以下 5 封电子邮件:

  • john.snow@gmail.com
  • jsnow@gmail.com
  • lordsnow@nightswatch.org
  • john.snow@facebook.com
  • john@winterfellstarks.com

以及每个链接联系人的单元格。

因此,如果我点击 lordsnow@nightswatch.org(显示的电子邮件列表中的索引 2) 并在 NSLog 的 shouldContinueAfterSelecting 回调中设置断点并打印出相关变量,这就是我将要看到的:

(lldb) po multiEmail
ABMultiValueRef 0x17737ca0 with 8 value(s)
    0: null (0x3b864a60) - john@winterfellstarks.com (0x15d4bd30)
    1: null (0x3b864a60) - lordsnow@nightswatch.org (0x15f0f2d0)
    2: null (0x3b864a60) - john.snow@gmail.com (0x15f3b470)
    3: null (0x3b864a60) - jsnow@gmail.com (0x15d02060)
    4: _$!<Work>!$_ (0x15f352d0) - john.snow@facebook.com (0x15f3d480)
    5: _$!<Other>!$_ (0x15fbeae0) - john.snow@gmail.com (0x15f2a170)
    6: _$!<Other>!$_ (0x15de9ce0) - jsnow@gmail.com (0x15f0f0e0)
    7: _$!<Other>!$_ (0x15f0a110) - lordsnow@nightswatch.org (0x15f00830)

(lldb) po selectedIndex
2

(lldb) po identifier
2

(lldb) po selectedEmail
john.snow@gmail.com

我真的很感激这里的一些帮助。

最佳答案

遗憾的是,这不是您正在寻找的答案。

我遇到了这个问题,但问题是电话号码,而不是电子邮件。同样的问题。

我通过禁用联系人(两个帐户 - gmail 和 icloud)然后再次打开它们来“修复”它。发生这种情况后,他们有一点时间重新链接,一切正常。

我认为这是一个损坏的地址簿,但当然没有证据:(

关于ios - 当联系人具有 LinkedContacts 时,ABMultiValueGetIndexForIdentifier 返回不正确的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044248/

相关文章:

ios - iOS音频单元

ios - Google 的收件箱是否有 iOS 邮件方案 url?

ios - 如何不在标签中显示 0?

ios - 如何使用 AFnetworking 发送 post 请求?

iphone - 如何从 ABAddressBookRef 中提取国家/地区字段?

ios - 将人员添加到联系人时应用商店中的应用程序崩溃?

ios - 检测 UIView 上的触摸

iOS - 名称标签时出现 "unrecognised selector sent to instance"错误

objective-c - 什么是分组模式下 UITableView 的良好数据结构

ios - ABPeoplePickerNavigationControllerDelegate 中的 ABMultiValueIdentifier 未正确设置,这是 iOS 错误吗?