Не позволяйте iOS делать снимки экрана приложения перед переходом в фоновый режим - PullRequest
27 голосов
/ 22 сентября 2011

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

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

Ответы [ 10 ]

29 голосов
/ 22 сентября 2011

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

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

14 голосов
/ 29 октября 2014

Необходимо написать код в методах жизненного цикла приложения, здесь мы помещаем 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;
    }
}

Работает и проверено должным образом.

10 голосов
/ 12 ноября 2013

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

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

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

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

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

6 голосов
/ 22 сентября 2011

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

2 голосов
/ 24 апреля 2018

Apple Doc https://developer.apple.com/library/archive/qa/qa1838/_index.html

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

Преобразованный код Apple в swift 4.2 Делегат приложения, которого я объявил

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
}
1 голос
/ 14 декабря 2017

Улучшение на посту Депак Кумар: Сделать объект 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;
    }
}
0 голосов
/ 02 мая 2019

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)
}
0 голосов
/ 30 января 2019

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

   - (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];
    }];

 }
0 голосов
/ 27 ноября 2018

Методы работы в 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()
}
0 голосов
/ 07 июля 2014

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

См .: Apple Developer: Справочник профилей конфигурации :

allowScreenShot


Boolean

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

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

...