46

我有一个使用通讯录的应用程序。在 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]断点,但这并没有给我更多信息。

即使应用程序在启动期间没有运行上述代码,也可以重现崩溃。

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

4

2 回答 2

76

我在自己的应用程序中看到了这一点。我也看到其他人也报告了这一点。我很确定这是故意的行为。操作系统会杀死任何对隐私权限更改做出反应的后台应用程序。苹果似乎对此采取了大锤的方法。这不是崩溃(尽管在调试器中运行时可能会出现这种情况)。应用程序因各种其他原因而终止。将此添加到原因列表中。这给了我们更多的理由在完全重启我们的应用程序时做好恢复应用程序状态的工作。

请注意,此行为适用于所有各种隐私设置,例如联系人、照片、麦克风、日历和相机。

于 2012-10-10T01:31:31.100 回答
-2

通常,当应用程序从暂停状态恢复时,它应该从您的 AppDelegate 调用 application:didEnterForeground。在我看来,那将是您重新调整通讯录权限的好地方。

于 2012-10-10T01:27:40.610 回答