应用程序在iOS 6中坠毁,当用户更改联系人的访问权限(App crashed in iOS 6 w

2019-06-18 11:20发布

我有一个使用通讯簿的应用程序。 当在iOS 6中运行它当用户做一些事情,需要通讯簿访问运行该代码。

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
{
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error)
    {
        if (granted)
        {
            showContactChooser();
        }
    });

    CFRelease(addressBookRef);
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
{
    showContactChooser();
}
else
{
    showAccessDeniedAlert();
}

这完美的作品:我能够读取联系人信息,并在用户拒绝访问,应用程序相应地做出反应。

但是,如果用户:

  1. 允许联系人在应用程序访问,
  2. 退出应用程序,
  3. 进入设置 - >与隐私>联系人和禁用应用程序访问联系人,
  4. 运行该应用程序,
  5. 当应用程序运行在后台去设置并启用了应用程序联系访问,

该应用立即崩溃内部main()没有异常信息或有意义的堆栈跟踪。 我试着打开了“所有异常”和[NSException raise]断点,但是这并没有给我任何信息。

崩溃可以重现,即使期间推出的应用程序并不运行上面的代码。

这里发生了什么事? 有没有我应该订阅回调?

Answer 1:

我在我自己的应用程序看到了这一点。 我也看到其他人报告这一点。 我敢肯定这是蓄意的行为。 操作系统杀死任何后台应用程序,在隐私权限的变化作出反应。 苹果似乎已经采取了大锤的方法来此。 这不是一个崩溃(虽然它可能会出现所以在调试器中运行时)。 应用程序就会被终止各种其他原因。 该加入的原因列表。 这给了我们更多的理由去做好在我们的应用程序的完全重启恢复应用程序状态。

请注意,此行为适用于所有的各种隐私设置,如通讯录,照片,麦克风,日历和摄像头。



Answer 2:

从你的AppDelegate didEnterForeground:通常情况下,当应用程序来自被暂停回来,它应该调用的应用程序。 在我看来,这将是为你调整你的地址簿权限的好地方。



文章来源: App crashed in iOS 6 when user changes Contacts access permissions