gpt4 book ai didi

ios - 当 Exchange 和 iCloud 电话号码在同一个条目中时,ABPeoplePicker 委托(delegate)返回不正确的标识符

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:21 24 4
gpt4 key购买 nike

我遇到一个问题,即 ABPeoplePickerNavigationController 似乎为电话号码从 Exchange 和 iCloud 同步的联系人返回了错误的标识符。我的应用程序在 iOS 7.1 上运行并使用 iOS 7.1 SDK 编译。

TL;DR - 在人员选择器委托(delegate)回调中,当我有一个联系人将 Exchange 和 iCloud 的电话号码合并在一起时,我得到了错误的标识符。

抢先回答:是的,我正在调用 ABMultiValueGetIndexForIdentifier。

只有当我有一个联系人同时使用 Exchange 和 iCloud 的电话号码时,才会出现此问题。我运行了使用 iOS 6.1 SDK 编译的旧版本应用程序,在 iOS 7.1 下运行时没有问题。

我已将测试简化为:

iPhone 已注册到 iCloud 并启用了联系人同步。 iPhone 还设置为使用 Exchange 检查邮件。作为交换。我有一个名为“Foo Bar”的联系人,有三个电话号码,这个联系人在 iPhone 中正确显示。此时,我的应用程序中的一切都按预期工作:

  • 工作电话:212-111-1111
  • 手机:212-222-2222
  • 家:212-333-3333
  • 工作传真:212-444-4444

iPad 已注册到 iCloud 并启用了联系人同步。此设备上未配置电子邮件。我用两个电话号码创建了一个名为“Foo Bar”的用户:

  • 家庭传真:212-555-5555
  • 工作传真:212-666-6666

在 iCloud 同步联系人后,我看到“Foo Bar”在 iPhone 上的 iOS 联系人应用程序中有 6 个电话号码。从 iOS 通讯录应用调用正确的号码。

在我的应用程序中,我显示了一个 ABPeoplePickerNavigationController。在委托(delegate)回调中,我得到了错误的电话号码。

在人员选择器中,我看到联系人的所有 6 个电话号码都按此顺序排列:

  • 工作电话:212-111-1111
  • 工作传真:212-444-4444
  • 家:212-333-3333
  • 手机:212-222-2222
  • 家庭传真:212-555-5555
  • 工作传真:212-666-6666

在委托(delegate)中,我显示了所有电话号码,它们始终按此顺序显示。看起来 iCloud 条目在 Exchange 号码上方的列表中(这无关紧要)。

  • xindex:0 电话:(212) 555-5555
  • xindex:1 电话:(212) 666-6666
  • xindex:2 电话:(212) 111-1111
  • xindex:3 电话:(212) 444-4444
  • xindex:4 电话:(212) 333-3333
  • xindex:5 电话:(212) 222-2222

当我从人员选择器中选择每个条目时,我在人员选择器委托(delegate)中得到这些结果:

  • 工作电话:identifier=0 index=0 phone=(212) 555-5555(错误:应该是212-111-1111)
  • 工作传真:identifier=1 index=1 phone=(212) 666-6666(错误:应该是212-444-4444)
  • Home: identifier=2 index=2 phone=(212) 111-1111(错误:应该是212-333-3333)
  • 手机:identifier=3 index=3 phone=(212) 444-4444(错误:应该是212-222-2222)
  • 家庭传真:identifier=0 index=0 phone=(212) 555-5555(正确)
  • 工作传真:identifier=1 index=1 phone=(212) 666-6666(正确)

看起来传递给委托(delegate)的标识符不正确,因为 0 和 1 用于 2 个不同的条目。也可能是标识符到索引的映射也不正确。

这是我简化的委托(delegate)回调:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
{
if (property == kABPersonPhoneProperty) {
ABMutableMultiValueRef multi = ABRecordCopyValue(person, property);
if (multi != NULL) {
//Display all the phone numbers for the object
CFIndex xcount = ABMultiValueGetCount(multi);
NSLog(@"xcount = %lu", (unsigned long)xcount);
for (CFIndex xindex = 0 ; xindex < xcount ; ++xindex) {
CFStringRef xphone = (CFStringRef)ABMultiValueCopyValueAtIndex(multi, xindex);
NSLog(@"xindex:%ld phone:%@", (long)xindex, (__bridge NSString*)xphone);
if (xphone) { CFRelease(xphone); }
}

//Display the selected phone number
CFIndex itemIndex = ABMultiValueGetIndexForIdentifier(multi, identifier);
CFStringRef phone = (CFStringRef)ABMultiValueCopyValueAtIndex(multi, itemIndex);
NSLog(@"identifier:%ld itemIndex:%ld phone:%@", (long)identifier, (long)itemIndex, (__bridge NSString*)phone);

if (phone) { CFRelease(phone); }
CFRelease(multi);
}
}
return NO;
}

我希望看到每个电话号码都有一个不同的标识符,可以映射到正确的索引号。我缺少一个步骤吗?这是 iOS 7 中的错误吗?

感谢任何帮助或见解。

最佳答案

ABMultiValueGetIndexForIdentifier()(或其背后的数据)在 iOS 8 和 9 中肯定是坏的。我不能告诉 iOS 7,因为那时我们没有崩溃跟踪。示例:

  • 有一个有 2 个地址的新联系人
  • 标识符现在是 (0, 1) 和相应的索引 (0, 1) 这是正确的
  • 删除第一个地址
  • 剩余地址的标识符是(1)和索引(-1)

标识符保持为 1 是可以理解的,因为它是一个标识符。但索引应该为 0。当您使用 3 个地址时,发生的情况会变得更加明显:

  • (0, 1, 2) 和 (0, 1, 2)
  • 删除第一个地址
  • 变成 (1, 2) 和 (1, -1)
  • 点击第一个地址返回第二个
  • 点击第二个地址会导致崩溃(如果您不检查索引 -1,实际上您一开始就不必检查)

如果 id 作为索引存在,ABMultiValueGetIndexForIdentifier 似乎返回标识符,如果 id 超出索引范围,则返回 -1。

我试图从不同的角度进行攻击,但 ABMultiValueGetIdentifierAtIndex 似乎也被破坏了。因此遍历条目也无济于事。 ABMultiValueGetIdentifierAtIndex 似乎总是返回索引本身(iOS 9)。

到目前为止,我不得不假设这是 iOS 中的一个错误。如果我在其他应用程序中使用我的测试联系人,他们似乎有完全相同的问题。根据您的数据,看起来标识符和 id-to-index-mapping 确实被破坏了。对我来说,这些 ID 是合理的(至少)。

我认为报告不会有帮助,因为 ABPeoplePicker 在 iOS 9 中已停用。

关于ios - 当 Exchange 和 iCloud 电话号码在同一个条目中时,ABPeoplePicker 委托(delegate)返回不正确的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com