【问题标题】:Why do the deprecated ABAddressBook APIs crash iOS 10?为什么已弃用的 ABAddressBook API 会导致 iOS 10 崩溃?
【发布时间】:2016-10-02 00:06:01
【问题描述】:

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

我有一个支持 iOS 8.3+ 的应用,它在 9.3.x 之前运行良好,但在 iOS 10 上出现问题。当我的应用让用户选择联系人时,我得到的错误是:

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

我发现another post here 表示不推荐使用 ABAddressBook API,我应该改用 CNContactPickerViewController(和相关的 ContactsUI 类)。我理解从弃用的类转移到新的和改进的类是推荐的解决方案的答案。但是为什么我必须这样做?

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

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

【问题讨论】:

    标签: ios abaddressbook


    【解决方案1】:

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

    确保调用ABAddressBookGetAuthorizationStatus(),如果结果为kABAuthorizationStatusNotDetermined,则必须调用ABAddressBookRequestAccessWithCompletion 并使用完成处理程序。只有在您的应用获得权限后才能使用其他通讯录 API(包括人员选择器)。

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

    【讨论】:

    • 我可以确认 ABAddressBook API 可以在 iOS 10 上找到,只要您遵循上面发布的指南,您应该将其用于 iOS 9+。
    • 这对我有用,谢谢!我猜它在没有 iOS 8 和 iOS 9 权限的情况下可以正常工作,但现在 iOS 10 强制需要用户权限。我还发现,在提示用户后,我的应用程序的设置页面中现在有一个“联系人 ”滑块(这很有意义)但是切换滑块会向应用程序发送 SIGKILL (9) 信号,导致它立即关闭。但这不是什么大问题,因为当用户切换回我的应用程序时,由于状态恢复,它会回到中断的地方。无论如何,再次感谢您的解决方案!
    • 是的,这是 iOS 10 的新需求。请不要忘记接受能解决您问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多