Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ABMultilValueGetIndexForIdentifier在联系人具有LinkedContacts时返回不正确的索引_Ios_Objective C_Abaddressbook_Abmultivalue - Fatal编程技术网

Ios ABMultilValueGetIndexForIdentifier在联系人具有LinkedContacts时返回不正确的索引

Ios ABMultilValueGetIndexForIdentifier在联系人具有LinkedContacts时返回不正确的索引,ios,objective-c,abaddressbook,abmultivalue,Ios,Objective C,Abaddressbook,Abmultivalue,我注意到,我们用于处理为ABPeoplePickerNavigationController提供的联系人选择特定电子邮件的逻辑中存在一个错误。当我们联系了Twitter或Facebook上的联系人时,就会出现该漏洞 我根据几个相关的StackOverflow问题仔细检查了我们的逻辑,我似乎在“正确”地做每件事: 以下是点击按钮后加载ABPeoplePicker的代码: - (void)setUpChooseContactButton { @weakify(self) [

我注意到,我们用于处理为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)时,此功能非常有效。但是,当联系人没有链接联系人时,此处打印的电子邮件地址将不是用户选择的地址

例如,我的联系人中有一个朋友,我们称他为约翰·斯诺,我们是好朋友,所以我通过iCloud、2个不同的gmail帐户和Facebook与他联系

当我浏览到John Snow的联系人页面时,我会看到以下5封电子邮件:

  • 约翰。snow@gmail.com
  • jsnow@gmail.com
  • lordsnow@nightswatch.org
  • 约翰。snow@facebook.com
  • john@winterfellstarks.com
以及每个链接触点的单元

所以如果我点击lordsnow@nightswatch.org(显示的电子邮件列表中的索引为2)并在shouldContinue中设置断点在NSLog中选择callback并打印出相关变量后,我将看到:

(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
(lldb)po多电子邮件
AB8值的多值参考0x17737ca0
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: _$!!$_ (0x15f352d0)-约翰。snow@facebook.com(0x15f3d480)
5: _$!!$_ (0x15fbeae0)-约翰。snow@gmail.com(0x15f2a170)
6: _$!!$_ (0x15de9ce0)-jsnow@gmail.com(0x15F0E0)
7: _$!!$_ (0x15f0a110)-lordsnow@nightswatch.org(0x15f00830)
(lldb)采购订单选择索引
2.
(lldb)采购订单标识符
2.
(lldb)采购订单选择电子邮件
厕所。snow@gmail.com

我非常感谢您的帮助。

遗憾的是,这不是您想要的答案

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

我通过禁用联系人(gmail和icloud两个帐户)然后再次打开来“修复”它。一旦发生这种情况,他们有一点时间重新连接,它工作得很好


我认为这是一本损坏的通讯录,但当然没有证据:(

我也看到了这一点。也没有找到解决方案:(