it-swarm.com.de

Verhindern Sie, dass iOS Screenshots der App erstellt, bevor Sie in den Hintergrund wechseln

Sie alle wissen vielleicht, dass iOS einen Screenshot Ihrer Anwendung erstellt, bevor Sie sie in den Hintergrund werfen. Dies ist in der Regel für eine bessere Benutzererfahrung wie schnelle Animationen, um die App zurückzubringen und so weiter. Ich möchte nicht, dass der Screenshot meiner App auf dem Gerät gespeichert wird. Das Multitasking muss jedoch noch vorhanden sein.

Ich habe eine Lösung herausgebracht, bin aber nicht sicher, ob ich in die richtige Richtung gehe. Wenn also applicationDidEnterBackground aufgerufen wird, füge ich ein Overlay-Image ein, das vom Betriebssystem erfasst wird, und sobald die App den Vordergrund erreicht, entferne ich das Overlay. Ich bin nicht sicher, ob das funktionieren wird, aber ich bin auf dem Weg, dies umzusetzen. In der Zwischenzeit helfen mir andere Überlegungen, die optimale Lösung für dieses Problem zu finden.

24
Mobilewits

Du bist auf dem richtigen Weg. Dies ist Apples empfohlener Weg, dies zu tun wie im iOS-Programmierhandbuch beschrieben :

Entfernen Sie vertrauliche Informationen aus Ansichten, bevor Sie in den Hintergrund wechseln. Wenn eine Anwendung in den Hintergrund wechselt, erstellt das System eine Momentaufnahme des Hauptfensters der Anwendung, die dann kurz angezeigt wird, wenn Sie Ihre Anwendung in den Vordergrund zurückkehren. Bevor Sie von Ihrer applicationDidEnterBackground:-Methode zurückkehren, sollten Sie Kennwörter und andere vertrauliche persönliche Informationen, die möglicherweise als Teil des Snapshots erfasst werden, ausblenden oder verdecken.

27
Ole Begemann

Sie müssen den Code in Application-Lifecycle-Methoden schreiben. Hier setzen wir eine imageView, während die App den Hintergrund animiert:

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

Hier ist der Code zum Entfernen der imageView:

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

Es funktioniert und richtig getestet.

14
Deepak Kumar

Ich bin auf das gleiche Problem gestoßen, und meine Forschung hat mich zu folgenden Antworten geführt:

  • legen Sie eine verschwommene Bildschirmüberlagerung fest, bevor die App in den Hintergrund wechselt. Sobald die App aktiv wird, entfernen Sie diese Überlagerung 

  • bei iOS 7 oder neuer können Sie die Funktion ignoreSnapshotOnNextApplicationLaunch verwenden 

In der Apple-Dokumentation finden Sie folgende Informationen: https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//Apple_ref/occ/instm/UIApplication/ ignoreSnapshotOnNextApplicationLaunch

Ich hoffe das hilft jemandem.

10
Lily

Ihr Ansatz ist genau der richtige und einzige Weg, dies zu tun. Platzieren Sie eine Überlagerungsansicht und entfernen Sie sie später. Dies ist zulässig, wenn Ihre App sensible Daten anzeigt, die Sie nicht irgendwo im Bildformat zwischenspeichern möchten. 

5
Krumelur

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

Hinweis: Ihre Implementierung von -applicationDidEnterBackground: sollte keine Animationen starten (NEIN an jeden animierten: Parameter übergeben). Der Schnappschuss des Anwendungsfensters wird sofort nach der Rückkehr von dieser Methode erfasst. Animationen werden erst abgeschlossen, wenn der Schnappschuss erstellt wurde.

Konvertierter Apple-Code in Swift 4.2-App-Delegat, den ich deklariert habe

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

Verbesserung im Depak Kumar-Beitrag: Eigenschaft erstellen 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

Arbeitsmethoden in 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()
}

Wo ist: 

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

Rufen Sie diese Methoden in den erforderlichen Delegatmethoden auf:

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

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

In iOS 7 können Sie die Variable allowScreenShot verwenden, um die gesamte Fähigkeit zu stoppen.

Siehe: Apple Developer: Konfigurationsprofilreferenz :

allowScreenShot 


Boolean
Wahlweise. Wenn false eingestellt ist, können Benutzer keinen Screenshot der Anzeige speichern und können keine Bildschirmaufzeichnung machen. Es verhindert auch, dass die Classroom-App Remote-Bildschirme beobachtet. Standardeinstellung ist true.

Verfügbarkeit: In iOS 9.0 aktualisiert, um Bildschirmaufnahmen aufzunehmen.

0
Michael Bazzoni

Implementierung mit etwas Animation im Hintergrund und umgekehrter Aktion 

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

Swift 4.0 Version.

für benutzerdefiniertes Symbol verwenden

fügen Sie diese Zeile zuerst oben in AppDelegate hinzu

var imageView: UIImageView?

und füge dies hinzu:

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
    }
}

Hintergrund mit schwarzer Farbe

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
blacker