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




window 10 screenshot (7)

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

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

}

È 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.


@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

Questo lo ha risolto per me, mi spiace per Xamarin.Forms ma dovresti avere l'idea. Devi chiamare UIView.SnapshotView (true) in xamarin o UIView snapshotViewAfterScreenUpdates su iOS. Funziona in DidEnterBackground su iOS7 e iOS8:

public override void DidEnterBackground(UIApplication uiApplication)
{
    App.Current.MainPage = new DefaultPage();
    **UIApplication.SharedApplication.KeyWindow.SnapshotView(true);**
    base.DidEnterBackground(uiApplication);
}

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

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 .


Non so perché, ma nessuno dei metodi descritti qui ha funzionato per me. Stavo semplicemente cercando di coprire lo schermo per motivi di sicurezza. Quindi, ciò che ha aiutato è stato un Q & A tecnico di Apple: https://developer.apple.com/library/ios/qa/qa1838/_index.html

Immagino che la differenza principale stia usando un UIViewController? Ad ogni modo, il seguente codice funziona perfettamente per me su IOS 9.1:

- (void)applicationDidEnterBackground:(UIApplication *)application
{     
    UIViewController *blankViewController = [UIViewController new];
    blankViewController.view.backgroundColor = [UIColor blackColor];

    [self.window.rootViewController presentViewController:blankViewController animated:NO completion:NULL];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [self.window.rootViewController dismissViewControllerAnimated:NO completion:NO];
}




uiapplicationdelegate