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

我有一个使用地址簿的应用程序。 当在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() ,没有exception信息或有意义的堆栈跟踪。 我试着打开“所有exception”和[NSException raise]断点,但是这并没有给我更多的信息。

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

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

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

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

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