Sur Préparer votre interface utilisateur à fonctionner en arrière-plan dit Apple :
Préparez votre interface utilisateur pour l'instantané de l'application
À un moment donné, après que votre application est entrée en arrière-plan et que votre méthode de délégation est revenue, UIKit prend un instantané de l'interface utilisateur actuelle de votre application. Le système affiche l'image résultante dans le sélecteur d'application. Il affiche également l'image temporairement lorsque votre application revient au premier plan.
L'interface utilisateur de votre application ne doit pas contenir d'informations sensibles sur les utilisateurs, telles que des mots de passe ou des numéros de carte de crédit. Si votre interface contient de telles informations, supprimez-les de vos vues lorsque vous entrez en arrière-plan. De même, écartez les alertes, les interfaces temporaires et les contrôleurs de vue système qui masquent le contenu de votre application. L'instantané représente l'interface de votre application et doit être reconnaissable par les utilisateurs. Lorsque votre application revient au premier plan, vous pouvez restaurer les données et les vues comme il convient.
Voir Q&A technique QA1838 : empêcher les informations sensibles d'apparaître dans le sélecteur de tâches
En plus de masquer/remplacer les informations sensibles, vous pouvez également indiquer à iOS 7 de ne pas prendre la capture d'écran via ignoreSnapshotOnNextApplicationLaunch
dont la documentation dit :
Si vous pensez que l'instantané ne peut pas refléter correctement l'interface utilisateur de votre application lorsque celle-ci est relancée, vous pouvez appeler ignoreSnapshotOnNextApplicationLaunch
pour empêcher cette image instantanée d'être prise.
Cela dit, il semble que la capture d'écran soit toujours prise et j'ai donc déposé un rapport de bug. Mais vous devriez effectuer d'autres tests et voir si l'utilisation de ce paramètre est utile.
S'il s'agissait d'une application d'entreprise, vous pourriez également vous pencher sur le paramétrage approprié de l'option allowScreenShot
décrit dans le Restrictions Charge utile de la section Référence du profil de configuration.
Voici une implémentation qui permet d'obtenir ce dont j'avais besoin. Vous pouvez présenter votre propre UIImageView
ou vous pouvez utiliser un modèle de protocole de délégué pour masquer les informations confidentielles :
// SecureDelegate.h
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
J'ai ensuite donné à mon délégué d'application une propriété pour cela :
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
Mon contrôleur de vue le définit :
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
Le contrôleur de vue met évidemment en œuvre ce protocole :
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
Et, enfin, mon délégué d'application se sert de ce protocole et de cette propriété :
- (void)applicationWillResignActive:(UIApplication *)application
{
[application ignoreSnapshotOnNextApplicationLaunch]; // this doesn't appear to work, whether called here or `didFinishLaunchingWithOptions`, but seems prudent to include it
[self.secureDelegate hide:@"applicationWillResignActive:"]; // you don't need to pass the "object", but it was useful during my testing...
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self.secureDelegate show:@"applicationDidBecomeActive:"];
}
Note, j'utilise applicationWillResignActive
plutôt que le conseillé applicationDidEnterBackground
car, comme d'autres l'ont souligné, cette dernière n'est pas appelée lorsque l'on appuie deux fois sur le bouton d'accueil alors que l'application est en cours d'exécution.
J'aimerais pouvoir utiliser les notifications pour gérer tout cela, plutôt que le modèle de protocole de délégation, mais dans mes tests limités, les notifications ne sont pas traitées de manière suffisamment rapide, mais le modèle ci-dessus fonctionne bien.
1 votes
Ma solution actuelle consiste à charger une vue vierge avec le logo de l'application lorsque l'application entre en hibernation et à la supprimer lorsque l'application revient, mais cette solution est difficile à gérer et ressemble plus à un hack qu'à une solution élégante. En outre, cette solution échoue de temps en temps en fonction de l'appareil, etc. Elle n'est donc pas vraiment utilisable.