Предотвращение моментального снимка вашего приложения при возврате из многозадачности

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

Защита паролем по-прежнему работает, но есть одна проблема. Apple делает что-то особенное, чтобы сделать его похожим на то, что наши приложения быстрее загружаются, когда они возвращаются с фона. Os берет изображение нашего экрана перед тем, как пользователь покидает приложение, и он показывает, что пока остальная часть приложения все еще загружается.

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

Как остановить отображение моментального снимка?

Ответ 1

Я решил это. Вот решение:

- (void)applicationDidEnterBackground:(UIApplication *)application{
    if (appHasPasscodeOn){
        UIImageView *splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 320, 480)];
        splashView.image = [UIImage imageNamed:@"Default.png"];
        [window addSubview:splashView];
        [splashView release];
    }
}

Default.png - это скриншот моего приложения с пустым экраном (для меня это просто пустой список). Вышеприведенный код ставит перед моим реальным представлением прямо перед тем, как приложение переходит в фоновый режим. Итак, когда вы вернетесь в приложение, это все, что вы видите. Вуаля.

Ответ 2

Отмеченный ответ отлично работает для меня, за исключением того, что когда приложение снова становится активным, splashView остается на экране. Я просто сделал это свойство и добавил [splashView removeFromSuperview] в свой applicationWillEnterForeground, чтобы исправить его. В случае, если кто-то другой получит подобное поведение.

Ответ 3

Вот приведенное выше решение в Swift 3.0:

lazy var splashView: UIImageView = {
    let splashView = UIImageView(frame: UIScreen.main.bounds)
    splashView.image = UIImage(named: "splash-view")

    return splashView
}()

func applicationDidEnterBackground(_ application: UIApplication) {
    guard let window = self.window else { fatalError("Window not found") }
    window.addSubview(self.splashView)
}

func applicationWillEnterForeground(_ application: UIApplication) {
   self.splashView.removeFromSuperview()
}