Приложение врезалось в 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();
}

Это отлично работает: я могу прочитать информацию о контактах, и когда пользователь отказал в доступе, приложение реагирует соответственно.

Однако, если пользователь:

  • Разрешает доступ к контактам в приложении,
  • Закрывает приложение,
  • Переход к настройкам- > Конфиденциальность- > Контакты и отключение доступа к контактам для приложения,
  • Запускает приложение,
  • Пока приложение работает в фоновом режиме, оно переходит в настройки и позволяет использовать контакт для приложения,

приложение сразу же сбой внутри main() без информации об исключении или значимой трассировки стека. Я попытался включить "все исключения" и [NSException raise] точку останова, но это не предоставило мне больше информации.

Авария может быть воспроизведена, даже если приложение не запускает указанный код во время запуска.

Что здесь происходит? Есть ли обратный вызов, на который я должен подписаться?

Ответ 1

Я видел это в своем приложении. И я видел, как другие сообщают об этом. Я уверен, что это преднамеренное поведение. ОС убивает любые фоновые приложения, которые реагируют на изменения в разрешениях на доступ к частной жизни. Похоже, что Apple применила к нему кувалду. Это не крушение (хотя может показаться, что он работает в отладчике). Приложения прекращаются по другим причинам. Добавьте это в список причин. Это дает нам больше оснований для хорошей работы по восстановлению состояния приложения при полном перезапуске наших приложений.

Обратите внимание, что это поведение относится ко всем различным параметрам конфиденциальности, таким как контакты, фотографии, микрофон, календарь и камера.

Ответ 2

Обычно, когда приложение возвращается из-под приостановления, оно должно вызывать приложение: didEnterForeground из вашего AppDelegate. На мой взгляд, это было бы хорошим местом для вас, чтобы перенаправить разрешения вашей адресной книги.