- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到一个问题,即 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 中正确显示。此时,我的应用程序中的一切都按预期工作:
iPad 已注册到 iCloud 并启用了联系人同步。此设备上未配置电子邮件。我用两个电话号码创建了一个名为“Foo Bar”的用户:
在 iCloud 同步联系人后,我看到“Foo Bar”在 iPhone 上的 iOS 联系人应用程序中有 6 个电话号码。从 iOS 通讯录应用调用正确的号码。
在我的应用程序中,我显示了一个 ABPeoplePickerNavigationController。在委托(delegate)回调中,我得到了错误的电话号码。
在人员选择器中,我看到联系人的所有 6 个电话号码都按此顺序排列:
在委托(delegate)中,我显示了所有电话号码,它们始终按此顺序显示。看起来 iCloud 条目在 Exchange 号码上方的列表中(这无关紧要)。
当我从人员选择器中选择每个条目时,我在人员选择器委托(delegate)中得到这些结果:
看起来传递给委托(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,因为那时我们没有崩溃跟踪。示例:
标识符保持为 1 是可以理解的,因为它是一个标识符。但索引应该为 0。当您使用 3 个地址时,发生的情况会变得更加明显:
如果 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/
我想做什么: 向用户展示其设备上所有联系人中包含电子邮件地址的联系人。 允许用户在点击“完成”之前选择/取消选择任意数量的联系人。 返回电子邮件地址数组...或包含所选联系人所有联系信息的字典数组。
因此,我在 UIViewController 中加载了一个 UITableView。该表从 NSMutableArray 获取数据 我在 NavigationBar 上添加了一个 UIBarButto
当使用 peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContin
在我的一个应用程序中,我将联系人保存在地址簿中,并将他们放在我创建的一个组中,以将他们与其他联系人区分开来。 有没有一种方法可以用 ABPeoplePicker 或类似 View 显示该组中的所有人,
我正在尝试为 iPhone 实现一个“更好”的地址簿,我只想对 Apple 当前的地址簿界面进行添加。我是否必须从头开始重新实现所有内容(按字母标题划分的联系人、右侧的所有字母按钮等)或者是否有办法以
我正在尝试创建 iPhone 应用程序的 Mac 版本,特别是我需要能够从用户的通讯录中选择一个人,类似于 iOS 上的 ABPeoplePicker。界面的外观并不是特别重要(无论是单独的弹出窗口还
我正在以模态方式呈现 ABPeoplePicker 实例,以允许我的用户从他们的联系人列表中选择人员。我想让他们一次选择多个联系人,所以我 return NO; 这个方法: - (BOOL)peopl
我遇到一个问题,即 ABPeoplePickerNavigationController 似乎为电话号码从 Exchange 和 iCloud 同步的联系人返回了错误的标识符。我的应用程序在 iOS
我是一名优秀的程序员,十分优秀!