为什么弃用的ABAddressBook API会导致iOS 10崩溃?

我想这主要是关于iOS如何处理弃用API的问题。

我有一个支持iOS 8.3+的应用程序,它在9.3.x下运行良好,但它在iOS 10上运行。当我的应用程序允许用户选择联系人时,我得到的错误是:

由于未捕获的exception“CNPropertyNotFetchedException”而终止应用程序,原因是:“获取联系人时未请求属性。”

我在这里发现了另一篇文章,其中说ABAddressBook API已被弃用,我应该使用CNContactPickerViewController(和相关的ContactsUI类)。 我理解的答案是,推荐的解决方案是从弃用的类转移到新的和改进的类。 但为什么我必须这样做?

我认为在以后的版本中通常仍然支持弃用的类和方法。 对我来说,我的应用程序在iOS 9.3上工作正常,然后在10.0上崩溃是没有意义的,特别是考虑到它编译得很好(部署目标是“8.3”,基本SDK是“最新(10.0)”。)此外,一些代码仍然有效(`ABAddressBookCreateWithOptions’)。

最后,有没有一种很好的方法来分析代码并强调所有这些使用过时的API? 我的构建输出没有显示任何此类警告。

我最近自己处理了这个问题。 问题与权限有关。

确保调用ABAddressBookGetAuthorizationStatus() ,如果结果为kABAuthorizationStatusNotDetermined则必须调用ABAddressBookRequestAccessWithCompletion并使用完成处理程序。 在您的应用被授予权限后,才使用其他地址簿API(包括人员选择器)。

尝试使用ABPeoplePickerNavigationController允许用户选择联系人的属性而不首先确保您的应用程序有权访问通讯簿,这将导致您的问题中发布错误。