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.
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.
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é.
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.
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.
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
}
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;
}
}
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()
}
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 surfalse
, 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 esttrue
.Disponibilité: Mis à jour dans iOS 9.0 pour inclure les enregistrements d'écran.
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];
}];
}