当用户更改联系人访问权限时,应用程序在iOS 6中崩溃

当用户更改联系人访问权限时,应用程序在iOS 6中崩溃,ios,cocoa-touch,ios6,abaddressbook,Ios,Cocoa Touch,Ios6,Abaddressbook,我有一个使用地址簿的应用程序。在iOS 6中运行时,当用户执行需要访问通讯簿的操作时,它会运行此代码 if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWi

我有一个使用地址簿的应用程序。在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();
}
这非常有效:我能够读取联系人信息,当用户拒绝访问时,应用程序会做出相应的反应

但是,如果用户:

允许在应用程序中访问联系人, 退出应用程序, 转到设置->隐私->联系人并禁用应用程序的联系人访问, 运行应用程序, 当应用程序在后台运行时,转到“设置”并启用应用程序的联系人访问, 应用程序立即在main内部崩溃,没有异常信息或有意义的堆栈跟踪。我尝试打开“所有异常”和[NSException raise]断点,但没有提供更多信息

即使应用程序在启动过程中没有运行上述代码,也可以复制崩溃


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

通常,当应用程序从挂起状态返回时,它应该从AppDelegate调用application:didenterfront。在我看来,这将是重新调整通讯簿权限的好地方。

我在自己的应用程序中看到了这一点。我也看到其他人报告了这一点。我很确定这是故意的行为。操作系统会杀死任何对隐私权限更改做出反应的后台应用程序。苹果似乎对此采取了严厉的措施。虽然在调试器中运行时可能会出现崩溃,但它不是崩溃。由于各种其他原因,应用程序被终止。将此添加到原因列表中。这让我们有更多的理由在应用程序完全重新启动后恢复应用程序状态


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

根据rmaddy下面的回答,这不是崩溃,这是iOS终止应用程序。对我来说也是同样的问题,但这是我的应用程序的位置权限:已验证iOS 7.0.3上的照片安全设置也会发生这种情况。从苹果的角度看似乎是合乎逻辑的,这里没有抱怨!是否有人知道在应用程序因安全更新而崩溃之前运行背景代码以保存某些数据的方法?经验证,iOS 7.0.3中的麦克风安全设置也会出现这种情况。在iOS 7日历相关应用中也会出现这种情况。如果您在设备上运行应用程序,而不是通过Xcode调试或模拟器,您将看到应用程序重新启动,用户不可见。所以,正如rmaddy所说,只要确保你的应用程序在完全重启后恢复应用程序状态时做得很好……这是故意的行为。如果在应用程序运行时更改应用程序权限,它将被终止。在我看来,最佳做法是在应用程序需要使用这些数据时请求权限,例如在进入特定屏幕时。