Есть ли способ узнать, что мое приложение iOS было убито изменением настроек конфиденциальности?

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

Я проверял, как мое приложение реагирует на изменения в настройках конфиденциальности, когда обнаружил следующее: каждый раз, когда я захожу в приложения «Настройки» и меняю параметр конфиденциальности для своего приложения (включаю или выключаю его), мое приложение уничтожается без любое предупреждение.

Я нашел эти журналы в консоли моего устройства:

Apr  8 15:01:50 iPad Preferences[5924] <Warning>: ########### Quitting application (xxx) in response to privacy settings change.
Apr  8 15:01:50 iPad com.apple.launchd[1] (UIKitApplication:xxx[0xc7cb][6039]) <Notice>: (UIKitApplication:com.edupad.itoochdev[0xc7cb]) Exited: Killed: 9
Apr  8 15:01:50 iPad backboardd[30] <Warning>: Application 'UIKitApplication:xxx[0xc7cb]' exited abnormally with signal 9: Killed: 9

И хотя я реализую applicationWillTerminate: в своем делегате приложения, похоже, что он не вызывается до того, как приложение будет уничтожено.

Я не могу найти никакой соответствующей документации о том, что я должен реализовать, чтобы получить уведомление до того, как мое приложение будет убито. Любая идея, если я могу решить это?

PS 1: я знаю, что мог бы реализовать applicationDidEnterBackground:, но я хотел бы предоставить другой UX в случае (A) пользователь просто быстро переключился на приложение настроек, чтобы изменить настройку конфиденциальности, или (B) пользователь хочет двигаться дальше и выиграл не вернусь в приложение раньше времени

PS 2: если вы тестируете такие вещи, не делайте этого, когда ваше приложение запускается через Xcode, иначе вы выйдете из строя из-за sigkill.


person Dirty Henry    schedule 08.04.2014    source источник
comment
Вы всегда должны ожидать, что ваше приложение может быть убито после того, как оно переключится в фоновый режим. Даже если пользователь быстро перейдет к настройкам конфиденциальности, он может вспомнить что-то еще, перейти в другое приложение и так далее. Таким образом, единственная возможность, которая у вас есть, это, вероятно, проверка того, сколько времени прошло между входом в фоновый и передний план.   -  person gnasher729    schedule 03.06.2015


Ответы (1)


Как правило, в тех случаях, когда вы хотите сохранить состояние или очистить код до того, как ваше приложение будет уничтожено, вам потребуется определить блок beginBackgroundTaskWithExpirationHandler.

Вы можете взглянуть на документы Apple WWDC 2012, в которых рассказывается о том, что происходит, когда настройки конфиденциальности изменяются в iOS6 и более поздних версиях. Вкратце, в нем говорится, что beginBackgroundTaskWithExpirationHandler вызывается перед отправкой SIGKILL, чтобы вы могли обрабатывать код очистки там.

Есть еще одно обсуждение переполнения стека в том же духе. Было бы полезно, если бы кто-то мог найти его и дать ссылку здесь.

person Shwethascar    schedule 08.05.2014
comment
Кажется, это больше не так в iOS 10 - person Learn OpenGL ES; 20.07.2017