Bei der Vorbereitung Ihrer Benutzeroberfläche für die Ausführung im Hintergrund sagt Apple:
Bereiten Sie Ihre Benutzeroberfläche für den App-Snapshot vor
Irgendwann, nachdem Ihre App in den Hintergrund getreten ist und Ihre Delegatenmethode zurückgekehrt ist, erstellt UIKit einen Schnappschuss der aktuellen Benutzeroberfläche Ihrer App. Das System zeigt das resultierende Bild im App-Umschalter an. Das Bild wird auch vorübergehend angezeigt, wenn Sie Ihre App wieder in den Vordergrund stellen.
Die Benutzeroberfläche Ihrer App darf keine vertraulichen Benutzerinformationen wie Passwörter oder Kreditkartennummern enthalten. Wenn Ihre Benutzeroberfläche solche Informationen enthält, entfernen Sie diese aus Ihren Ansichten, wenn Sie den Hintergrund eingeben. Schließen Sie außerdem Warnungen, temporäre Schnittstellen und Systemansichts-Controller, die den Inhalt Ihrer App verdecken. Der Schnappschuss stellt die Benutzeroberfläche Ihrer App dar und sollte für Benutzer erkennbar sein. Wenn Ihre App wieder in den Vordergrund zurückkehrt, können Sie Daten und Ansichten entsprechend wiederherstellen.
Siehe Technische Fragen und Antworten QA1838: Verhindern, dass vertrauliche Informationen im Task-Umschalter angezeigt werden
Zusätzlich zum Verdecken / Ersetzen vertraulicher Informationen möchten Sie iOS 7 möglicherweise anweisen, den Bildschirmschnappschuss nicht über zu ignoreSnapshotOnNextApplicationLaunch
erstellen. In der Dokumentation heißt es:
Wenn Sie der Meinung sind, dass der Snapshot die Benutzeroberfläche Ihrer App beim Neustart Ihrer App nicht korrekt wiedergeben kann, können Sie anrufen ignoreSnapshotOnNextApplicationLaunch
, um zu verhindern, dass das Snapshot-Bild aufgenommen wird.
Trotzdem scheint der Screenshot noch aufgenommen zu sein und ich habe daher einen Fehlerbericht eingereicht. Sie sollten jedoch weiter testen und prüfen, ob die Verwendung dieser Einstellung hilfreich ist.
Wenn es sich um eine Unternehmensanwendung handelt, sollten Sie auch die entsprechende Einstellung allowScreenShot
überprüfen, die im Abschnitt Einschränkungen der Nutzlast der Konfigurationsprofilreferenz beschrieben ist.
Hier ist eine Implementierung, die das erreicht, was ich brauchte. Sie können Ihr eigenes präsentieren UIImageView
oder ein Delegate-Protokoll-Muster verwenden, um die vertraulichen Informationen zu verschleiern:
// SecureDelegate.h
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
Ich habe dann meinem App-Delegierten eine Eigenschaft dafür gegeben:
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
Mein View Controller legt es fest:
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
Der View Controller implementiert offensichtlich dieses Protokoll:
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
Und schließlich nutzt mein App-Delegierter dieses Protokoll und diese Eigenschaft:
- (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:"];
}
Beachten Sie, dass ich applicationWillResignActive
eher die empfohlene als die empfohlene verwende applicationDidEnterBackground
, da letztere, wie andere bereits betont haben, nicht aufgerufen wird, wenn Sie zweimal auf die Home-Schaltfläche tippen, während die App ausgeführt wird.
Ich wünschte, ich könnte Benachrichtigungen verwenden, um all dies zu verarbeiten, anstatt das Muster des Delegiertenprotokolls, aber in meinen begrenzten Tests werden die Benachrichtigungen nicht rechtzeitig genug verarbeitet, aber das obige Muster funktioniert einwandfrei.