Подтвердить что ты не робот

Предотвращение блокировки приложения iOS перед тем, как войти в фоновый режим

Вы все можете знать, что iOS снимает снимок вашего приложения, прежде чем бросать его в фоновом режиме. Это, как правило, для лучшего пользовательского опыта, такого как быстрая анимация, чтобы вернуть приложение и так далее. Я не хочу, чтобы на экране сохранялся снимок экрана приложения, но я хочу, чтобы многозадачность все еще существовала.

У меня появилось решение, но я не уверен, что я направляюсь в правильном направлении. Таким образом, когда вызывается applicationDidEnterBackground, я помещаю в оверлейное изображение, которое будет захвачено ОС, и как только приложение войдет на передний план, я удалю оверлей. Я не уверен, что это сработает, но я нахожусь на пути к этому. Между тем, любые другие мысли по этому поводу помогут мне разобраться в оптимальном способе решения этой проблемы.

4b9b3361

Ответ 1

Ты на правильном пути. Это рекомендуемый Apple способ сделать это, как отмечено в Руководстве по программированию приложений iOS:

Удалите конфиденциальную информацию из представлений, прежде чем перейти к фону. Когда приложение переходит в фоновый режим, система делает снимок главного окна приложения, который затем кратко представляет при переводе приложения обратно на передний план. Прежде чем вернуться из вашего applicationDidEnterBackground: метода, вы должны скрыть или скрыть пароли и другую конфиденциальную личную информацию, которая может быть захвачена как часть снимка.

Ответ 2

Необходимо написать код в методах жизненного цикла приложения, здесь мы помещаем imageView, а приложение оживляет фон:

-(void)applicationWillResignActive:(UIApplication *)application
{
    imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [imageView setImage:[UIImage imageNamed:@"Splash_Screen.png"]];
    [self.window addSubview:imageView];
}

Вот код для удаления imageView:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if(imageView != nil) {
        [imageView removeFromSuperview];
        imageView = nil;
    }
}

Он работает и проверен правильно.

Ответ 3

Я столкнулся с той же проблемой, и мои исследования привели меня к следующим ответам:

  • установите размытое наложение экрана перед тем, как приложение зайдет в фоновом режиме и как только приложение станет активным, удалите этот оверлей

  • если это iOS 7 или более поздняя версия, вы можете использовать функцию ignoreSnapshotOnNextApplicationLaunch

См. документацию по яблоку: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

Надеюсь, это поможет кому-то.

Ответ 4

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

Ответ 5

Документ Apple, https://developer.apple.com/library/archive/qa/qa1838/_index.html

Примечание. Ваша реализация -applicationDidEnterBackground: не должна запускать анимацию (передайте NO любому параметру animated:). Снимок окна вашего приложения создается сразу после возвращения из этого метода. Анимации не будут завершены до того, как будет сделан снимок.

Преобразованный код Apple в делегате Swift 4.2 App, который я объявил

func applicationDidEnterBackground(_ application: UIApplication) {
    // Your application can present a full screen modal view controller to
    // cover its contents when it moves into the background. If your
    // application requires a password unlock when it retuns to the
    // foreground, present your lock screen or authentication view controller here.

    let blankViewController = UIViewController()
    blankViewController.view.backgroundColor = UIColor.black

    // Pass NO for the animated parameter. Any animation will not complete
    // before the snapshot is taken.
    window.rootViewController?.present(blankViewController, animated: false)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // This should be omitted if your application presented a lock screen
    // in -applicationDidEnterBackground:
    window.rootViewController?.dismiss(animated: false) false
}

Ответ 6

Улучшение должности Депака Кумара: Сделайте свойство UIImage *snapShotOfSplash;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch];
snapShotOfSplash =[UIImage imageNamed:@"splash_logo"];
}

- (void)applicationDidEnterBackground:(UIApplication *)application {


    self.overlayView = [[UIImageView alloc]initWithFrame:[self.window frame]];
    self.overlayView.backgroundColor = [UIColor whiteColor];
    [self.overlayView setImage:snapShotOfSplash];
    [self.overlayView setContentMode:UIViewContentModeCenter];
    [self.window addSubview:self.overlayView];
    [self.window bringSubviewToFront:self.overlayView]; }

- (void)applicationDidBecomeActive:(UIApplication *)application {
if(self.overlayView != nil) {
        [self.overlayView removeFromSuperview];
        self.overlayView = nil;
    }
}

Ответ 7

В iOS 7 вы можете использовать allowScreenShot, чтобы остановить все вместе.

Смотрите: Разработчик Apple: описание профиля конфигурации:

allowScreenShot


логический
Необязательный. Если установлено значение false, пользователи не могут сохранить скриншот дисплея и не смогут захватить запись на экране; это также препятствует тому, чтобы приложение Classroom наблюдало удаленные экраны. По умолчанию true.

Доступность: Обновлено в iOS 9.0 для включения записей на экране.

Ответ 8

Методы работы в AppDelegate, swift 4.2:

func blurScreen(style: UIBlurEffect.Style = UIBlurEffect.Style.regular) {
    screen = UIScreen.main.snapshotView(afterScreenUpdates: false)
    let blurEffect = UIBlurEffect(style: style)
    let blurBackground = UIVisualEffectView(effect: blurEffect)
    screen?.addSubview(blurBackground)
    blurBackground.frame = (screen?.frame)!
    window?.addSubview(screen!)
}

func removeBlurScreen() {
    screen?.removeFromSuperview()
}

Где:

weak var screen : UIView? = nil // property of the AppDelegate

Вызовите эти методы в необходимых методах делегата:

func applicationWillResignActive(_ application: UIApplication) {
    blurScreen()
}

func applicationDidBecomeActive(_ application: UIApplication) {
    removeBlurScreen()
}

Ответ 9

Реализация с некоторой анимацией при переходе в фоновый режим и обратном действии

   - (void)applicationWillResignActive:(UIApplication *)application
{
     //     fill screen with our own colour
        UIView *colourView = [[UIView alloc]initWithFrame:self.window.frame];
        colourView.backgroundColor = [UIColor blackColor];
        colourView.tag = 1111;
        colourView.alpha = 0;
        [self.window addSubview:colourView];
        [self.window bringSubviewToFront:colourView];

        // fade in the view
        [UIView animateWithDuration:0.5 animations:^{
            colourView.alpha = 1;
        }];

}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // grab a reference to our coloured view
    UIView *colourView = [self.window viewWithTag:1111];
    // fade away colour view from main view
    [UIView animateWithDuration:0.5 animations:^{
        colourView.alpha = 0;
    } completion:^(BOOL finished) {
        // remove when finished fading
        [colourView removeFromSuperview];
    }];

 }

Ответ 10

версия swift 4.0.

для использования пользовательского значка

сначала добавьте эту строку в верхней части AppDelegate

var imageView: UIImageView?

и добавьте это:

func applicationDidEnterBackground(_ application: UIApplication) {
    imageView = UIImageView(frame: window!.frame)
    imageView?.image = UIImage(named: "AppIcon")
    window?.addSubview(imageView!)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    if imageView != nil {
        imageView?.removeFromSuperview()
        imageView = nil
    }
}

фон с черным цветом

func applicationDidEnterBackground(_ application: UIApplication) {
    let blankViewController = UIViewController()
    blankViewController.view.backgroundColor = UIColor.black
    window?.rootViewController?.present(blankViewController, animated: false)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    window?.rootViewController?.dismiss(animated: false)
}