ios - una - window 10 screenshot




Visualizza una vista o una schermata iniziale prima dell'applicazioneDidEnterBackground(per evitare lo screenshot della vista attiva) (6)

Ho informazioni riservate nella mia app, quindi mi piacerebbe nasconderle con una schermata iniziale quando l'app sta per essere spostata sullo sfondo.

Eseguo l'app su iOS6 e oltre.

Ho provato a visualizzare la vista in applicationWillResignActive ma il problema è che visualizza la schermata iniziale anche quando il pannello di controllo di scorrimento utente, ad esempio. Voglio che venga mostrato solo quando l'app viene spostata sullo sfondo.

Ho provato a visualizzare il mio splashScreen in applicationDidEnterBackground ma prima lo screenShot così le informazioni vengono visualizzate durante il restauro durante l'animazione.

Ecco lo spirito di ciò che voglio:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [_window addSubview:__splashController.view];
}

È necessario scrivere il codice come segue:

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

Qui per rimuovere la vista di immagini:

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

Funziona e correttamente testato.


Avendo lo stesso problema, essenzialmente stavo usando applicationDidEnterBackground per mostrare un UIWindow sopra il contenuto, ma in iOS8 non funzionava come in iOS7.

La soluzione che ho trovato era creare UIWindow in applicationWillResignActive ma renderlo nascosto securityWindow.hidden = YES ; e poi in applicationDidEnterBackground tutto ciò che farei sarebbe cambiare securityWindow.hidden = NO .

Questo sembra funzionare esattamente come iOS7 che oscura il contenuto quando il multitasking non influisce sulla vista quando si utilizza NotificationCenter o ControlPanel.


Penso che il problema sia che stai testando il simulatore . Sul dispositivo, dovrebbe funzionare correttamente.

Ho provato questo e ha funzionato. Aggiungi una visualizzazione di immagini con la tua immagine splash quando l'app entra in background -

- (void)applicationDidEnterBackground:(UIApplication *)application
{

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.window.bounds];

        imageView.tag = 101;    // Give some decent tagvalue or keep a reference of imageView in self
    //    imageView.backgroundColor = [UIColor redColor];
        [imageView setImage:[UIImage imageNamed:@"Default.png"]];   // assuming Default.png is your splash image's name

        [UIApplication.sharedApplication.keyWindow.subviews.lastObject addSubview:imageView];
}

E quando app torna in primo piano -

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    UIImageView *imageView = (UIImageView *)[UIApplication.sharedApplication.keyWindow.subviews.lastObject viewWithTag:101];   // search by the same tag value
    [imageView removeFromSuperview];

}

NOTA - Sul simulatore (iOS 7.0), la sottoview aggiunta non viene visualizzata quando si controlla premendo due volte il tasto Home (Cmd + H), ma sul dispositivo funziona come previsto (come paypal , app BofA )

EDIT: (Ulteriori informazioni)

Oltre a oscurare / sostituire le informazioni sensibili aggiungendo subview / blur come spiegato sopra, iOS 7 offre la possibilità di ignorare l'istantanea dello schermo tramite ignoreSnapshotOnNextApplicationLaunch di UIApplication all'interno di applicationWillResignActive o applicationDidEnterBackground .

UIApplication.h

// Indicate the application should not use the snapshot on next launch, even if there is a valid state restoration archive.
// This should only be called from methods invoked from State Preservation, else it is ignored.
- (void)ignoreSnapshotOnNextApplicationLaunch NS_AVAILABLE_IOS(7_0);

Inoltre, è possibile esplorare il flag allowScreenShot in Restrizioni Payload .


Penso che questo servirà per Swift 3.0

func applicationWillResignActive(_ application: UIApplication) {

        let imageView = UIImageView(frame: self.window!.bounds)
        imageView.tag = 101
        imageView.backgroundColor = UIColor.white
        imageView.contentMode = .center
        imageView.image = #image#
        UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)

    }

func applicationWillEnterForeground(_ application: UIApplication) {
        ReachabilityManager.shared.stopMonitoring()
        if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
            imageView.removeFromSuperview()
        }
    }

Swift 3.0 Risposta per coloro che sono pigri a tradurre.

func applicationDidEnterBackground(_ application: UIApplication) {

    let imageView = UIImageView(frame: self.window!.bounds)
    imageView.tag = 101
    imageView.image = ...

    UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)
 }

func applicationWillEnterForeground(_ application: UIApplication) {

    if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
        imageView.removeFromSuperview()
    }

}

@interface MyAppDelegate ()
@property (strong, nonatomic) MySplashView *splashView;
@end
@implementation MyAppDelegate
- (void)applicationWillResignActive:(UIApplication *)application {
    // hide keyboard and show a splash view
    [self.window endEditing:YES];
    MySplashView *splashView = [[MySplashView alloc] initWithFrame:self.window.bounds];
    [self.window addSubview:splashView];
    self.splashView = splashView;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // remove the splash view
    if (self.splashView) {
        [self.splashView removeFromSuperview];
        self.splashView = nil;
    }
}
@end




uiapplicationdelegate