首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS10上的地址簿崩溃

iOS10上的地址簿崩溃
EN

Stack Overflow用户
提问于 2016-09-23 08:38:26
回答 3查看 2.7K关注 0票数 3

从联系人选择器中选择联系人会使iOS10.0中的应用程序崩溃。联系人选取器使用ABPeoplePickerNavigationController显示,如下所示:

代码语言:javascript
复制
let contactsPicker = ABPeoplePickerNavigationController()
contactsPicker.peoplePickerDelegate = self
self.presentViewController(contactsPicker, animated: true, completion: nil)

以下是来自崩溃日志的堆栈跟踪:

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'CNPropertyNotFetchedException', reason: 'A property was not requested when contact was fetched.'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000105a1c34b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00000001052cd21e objc_exception_throw + 48
    2   CoreFoundation                      0x0000000105a85265 +[NSException raise:format:] + 197
    3   Contacts                            0x000000010dc6d96f -[CNContact sectionForSortingByFamilyName] + 160
    4   Contacts                            0x000000010dc3e18e __55-[CNContact(iOSABCompatibility) overwritePerson:error:]_block_invoke + 44
    5   CoreFoundation                      0x00000001059ad2fd __53-[__NSArrayI enumerateObjectsWithOptions:usingBlock:]_block_invoke + 77
    6   CoreFoundation                      0x00000001059ad1df -[__NSArrayI enumerateObjectsWithOptions:usingBlock:] + 207
    7   Contacts                            0x000000010dc3e0f4 -[CNContact(iOSABCompatibility) overwritePerson:error:] + 240
    8   Contacts                            0x000000010dc3dfc0 -[CNContact(iOSABCompatibility) detachedPersonWithError:] + 46
    9   AddressBookUI                       0x00000001057bdd77 -[ABPeoplePickerNavigationController contactPicker:didSelectContact:] + 145
    10  ContactsUI                          0x0000000112396eb2 -[CNContactPickerViewController pickerDidSelectContact:property:] + 306
    11  ContactsUI                          0x000000011243ee6f -[CNContactPickerHostViewController pickerDidSelectContact:property:] + 95
    12  ContactsUI                          0x000000011243f5ec __71-[CNContactPickerExtensionHostContext pickerDidSelectContact:property:]_block_invoke + 66

我已经在info.plist中添加了NSContactsUsageDescription,就像在Contact Address book crash on iOS 10 beta上讨论的那样,但这没有帮助,而且我不能使用CNContactPickerViewController,因为我需要支持iOS8设备。

EN

回答 3

Stack Overflow用户

发布于 2016-09-26 14:49:00

伊姆兰·拉希姆

来自Erdekhayser的解决方案(Contact Address book crash on iOS 10 beta)

您可以使用此方法检查CNContactPickerViewController是否可用?

代码语言:javascript
复制
if (NSClassFromString(@"CNContactPickerViewController")) {
        // iOS 9, 10, use CNContactPickerViewController
        CNContactPickerViewController *picker = [[CNContactPickerViewController alloc] init];
        picker.delegate = self;
        picker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];
        [pr presentViewController:picker animated:YES completion:nil];
    }else{
        // iOS 8 Below, use ABPeoplePickerNavigationController
        ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
        picker.peoplePickerDelegate = self;
        [pr presentViewController:picker animated:YES completion:nil];
    }
票数 1
EN

Stack Overflow用户

发布于 2016-09-26 14:47:05

地址簿API在iOS 9中被弃用,取而代之的是更加面向对象的联系人框架。

移动到CNContactPickerViewController而不是使用ABPeoplePickerViewController。

票数 0
EN

Stack Overflow用户

发布于 2018-10-08 21:28:11

当我试图从委托方法的CNContact中获取一个emailAddresses时,我得到了同样的错误。

最初,我初始化contactpicker:

代码语言:javascript
复制
//MARK: Contact Action
@IBAction func getContactListAction(_ sender: Any) {

    let contactPicker = CNContactPickerViewController()
    contactPicker.delegate = self
    contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey]

    vcObject.present(contactPicker, animated: true, completion: nil)
}

委托方法:

//MAKE:联系Delegate

代码语言:javascript
复制
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
    picker.dismiss(animated: true, completion: nil)
    let name = CNContactFormatter.string(from: contact, style: .fullName)
    print(name!)
    self.textfieldName.text = name!


    for number in contact.phoneNumbers {

        print("number ----\(number)")

        let mobile = number.value.value(forKey: "digits") as? String
        if (mobile?.count)! > 7 {
            // your code goes here
            print("mobile---\(String(describing: mobile))")
            self.textfieldMobileNumber.text = mobile!
        }
    }


 // this line couse the crash ---> print(contact.emailAddresses[0].value(forKey: "value") as! String)

}

我没有在初始化时声明就访问了电子邮件地址。错误-- Terminating app due to uncaught exception 'CNPropertyNotFetchedException', reason: 'A property was not requested when contact was fetched.'

访问电子邮件的正确代码

Xcode 10。和4.2

代码语言:javascript
复制
//MARK: Contact Action
@IBAction func getContactListAction(_ sender: Any) {

    let contactPicker = CNContactPickerViewController()
    contactPicker.delegate = self

    contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey,CNContactEmailAddressesKey] . 
 // <--- Here make declaration for accessing the required property from CNContact.

    vcObject.present(contactPicker, animated: true, completion: nil)


}

//MAKE: Contact Delegate
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
    picker.dismiss(animated: true, completion: nil)
    let name = CNContactFormatter.string(from: contact, style: .fullName)
    print(name!)
    self.textfieldName.text = name!


    for number in contact.phoneNumbers {

        print("number ----\(number)")

        let mobile = number.value.value(forKey: "digits") as? String
        if (mobile?.count)! > 7 {
            // your code goes here
            print("mobile---\(String(describing: mobile))")
            self.textfieldMobileNumber.text = mobile!
        }
    }


//        print(contact.emailAddresses[0].value.value(forKey: "labelValuePair") as! String)

    for email in contact.emailAddresses {

        print("number ----\(email)")

        let eml = email.value(forKey: "value") as? String
        print("eml --\(eml!)")
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39650873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档