gpt4 book ai didi

ios - 使用 AdressBookUI 选择特定联系人时如何防止崩溃

转载 作者:行者123 更新时间:2023-11-29 10:29:50 24 4
gpt4 key购买 nike

我在这条线上遇到了崩溃。

    phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(numbers, index));

如果选择了第一个电话号码,我得到的索引为 1,这是错误的。它应该是 0,因此选择了错误的数字。如果我选择第二个数字,它会给出索引 -1,这会导致应用程序崩溃。

#pragma mark helper methods

- (void)didSelectPerson:(ABRecordRef)person identifier:(ABMultiValueIdentifier)identifier {
NSString *phoneNumber = @"";
ABMultiValueRef numbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
if (numbers) {
if (ABMultiValueGetCount(numbers) > 0) {
CFIndex index = 0;
if (identifier != kABMultiValueInvalidIdentifier) {
index = ABMultiValueGetIndexForIdentifier(numbers, identifier);
}
phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(numbers, index));
}
CFRelease(numbers);
}
self.numberTextField.text = [NSString stringWithFormat:@"%@", phoneNumber];
}

最佳答案

在处理已删除电话号码/电子邮件的联系人副本时,iOS 8.3(可能是之前的 iOS 8 版本)存在错误。 ABPeoplePickerNavigationController 的文档指出:

In iOS 8 and later bringing up a people-picker navigtion controller does not require the app to have access to a user’s contacts, and the user will not be prompted to grant access. If the app does not itself have access to the user’s contacts, a temporary copy of the contact selected by the user will be returned to the app.

在我的测试中,我有一个具有三个电话号码的联系人(我们称它们为 111222333)。 identifier 似乎是固定的、稳定的从零开始的值。因此我的三个电话号码是 02 的标识符。如果电话号码被删除,标识符不会改变。从零开始的 indexes 用于访问当前的电话号码列表(或电子邮件等),ABMultiValueGetIndexForIdentifier 用于将标识符转换为索引。

在我的测试中,我删除了第一个电话号码,111。这不会更改其余电话号码的标识符(222=1333=2)。

当我使用 ABPeoplePickerNavigationController 并选择第一个电话号码 (222) 时,委托(delegate)方法 peoplePickerNavigationController: didSelectPerson:property:identifier: 正确通过1 的标识符。但是,ABMultiValueGetIndexForIdentifier 返回索引 1,而不是 0,然后我的应用将电话号码 333 复制为它认为用户已选择的电话号码。如果用户选择了 333 然后我被正确传递了 2 的标识符但是 ABMultiValueGetIndexForIdentifier 将其转换为 -1 并且然后对 ABMultiValueCopyValueAtIndex 的未 protected 调用崩溃了。

因此,当处理联系人的副本时(这是在 iOS 8 中当应用程序未被授权访问地址簿时发生的情况),iOS 似乎使用基于的标识符真正的接触,但索引是基于副本的。该副本似乎忘记了之前删除的电话号码,如果用户选择了一个在之前删除的电话号码之后创建的电话号码,标识符到索引的映射就会出错。如果用户没有删除电话号码,或者如果他们删除了他们选择的电话号码之后,它会起作用。

解决方法是让应用使用 ABAddressBookRequestAccessWithCompletion 请求用户访问地址簿的权限,从而使应用复杂化。一旦获得授权,应用程序将不会获得所选联系人的副本,并且标识符到索引的映射工作正常。

关于ios - 使用 AdressBookUI 选择特定联系人时如何防止崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30257536/

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