web-dev-qa-db-fra.com

Empêcher iOS de prendre une capture d'écran de l'application avant de passer à l'arrière-plan

Vous savez tous peut-être qu'iOS prend une capture d'écran de votre application avant de la jeter en arrière-plan. C'est généralement pour une meilleure expérience utilisateur, comme une animation rapide, pour ramener l'application, etc. Je ne veux pas que ma capture d'écran d'application soit stockée sur l'appareil, mais je veux que le multitâche existe toujours.

Je suis sorti avec une solution mais je ne suis pas sûr si je vais dans la bonne direction. Ainsi, lorsque la applicationDidEnterBackground est appelée - je mets une image de surimpression qui sera capturée par le système d’exploitation, et une fois que l’application entre au premier plan, je supprime la superposition. Je ne sais pas si cela fonctionnera, mais je suis sur le point de le mettre en œuvre. En attendant, toute autre réflexion à ce sujet m'aidera à déterminer le meilleur moyen de s'attaquer à ce problème.

24
Mobilewits

Tu es sur la bonne piste. C'est la méthode recommandée par Apple pour le faire comme indiqué dans le Guide de programmation d'applications iOS :

Supprime les informations sensibles des vues avant de passer à l'arrière-plan. Quand une application passe en arrière-plan, le système prend un instantané de la fenêtre principale de l’application, qu’il présente ensuite brièvement lors de la transition de votre application au premier plan. Avant de revenir de votre méthode applicationDidEnterBackground:, vous devez masquer ou masquer les mots de passe et autres informations personnelles sensibles susceptibles d'être capturées dans le cadre de la capture instantanée.

27
Ole Begemann

Besoin d'écrire le code dans les méthodes du cycle de vie de l'application, nous mettons ici une imageView pendant que l'application s'anime en arrière-plan:

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

Voici le code pour supprimer la imageView:

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

Cela fonctionne et correctement testé.

14
Deepak Kumar

Je suis tombé sur le même problème et mes recherches m'ont conduit aux réponses suivantes:

  • définir une superposition d'écran floue avant que l'application ne passe en arrière-plan et une fois qu'elle devient active, supprimez cette superposition 

  • si vous utilisez iOS 7 ou une version ultérieure, vous pouvez utiliser la fonction ignoreSnapshotOnNextApplicationLaunch. 

Voir dans la documentation Apple: https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//Apple_ref/occ/instm/UIApplication/ ignoreSnapshotOnNextApplicationLaunch

J'espère que cela aide quelqu'un.

10
Lily

Votre approche est exactement la seule et correcte façon de le faire. Placez une vue de superposition et supprimez-la plus tard. Cela est valable si votre application affiche des données sensibles que vous ne souhaitez pas mettre en cache au format image. 

5
Krumelur

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

Remarque: Votre implémentation de -applicationDidEnterBackground: ne doit démarrer aucune animation (passez NO à un paramètre animé:). L'instantané de la fenêtre de votre application est capturé dès le retour de cette méthode. Les animations ne s'achèveront pas avant la prise de l'instantané.

Code Apple converti dans Swift 4.2: le délégué de l'application que j'ai déclaré

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
}
2
Ourang-Zeb Khan

Amélioration de la publication de Depak Kumar: Créer une propriété 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;
    }
}
1
Xeieshan

Méthodes de travail dans 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()
}

Où se trouve: 

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

Appelez ces méthodes dans les méthodes de délégué nécessaires:

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

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

Dans iOS 7, vous pouvez utiliser la variable allowScreenShot pour arrêter la capacité tous ensemble.

Voir: Développeur Apple: Référence du profil de configuration :

allowScreenShot 


Boolean
Optionnel. Si cette option est définie sur false, les utilisateurs ne peuvent pas enregistrer une capture d'écran de l'affichage et ne peuvent capturer un enregistrement d'écran. cela empêche également l'application Classroom d'observer les écrans distants. La valeur par défaut est true.

Disponibilité: Mis à jour dans iOS 9.0 pour inclure les enregistrements d'écran.

0
Michael Bazzoni

Implémentation avec quelques animations en arrière-plan et en action inverse 

   - (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
Ankit Aman