Evitar que iOS tome captura de pantalla de la aplicación antes de pasar a segundo plano


Es posible que todos sepan que iOS toma una captura de pantalla de su aplicación antes de lanzarla en segundo plano. Esto es generalmente para una mejor experiencia de usuario como animación rápida para traer la aplicación de vuelta y así sucesivamente. No quiero que mi captura de pantalla de la aplicación se almacene en el dispositivo, pero quiero que la multitarea siga existiendo.

Salí con una solución, pero no estoy seguro de si me estoy dirigiendo en la dirección correcta. Entonces, cuando se llama applicationDidEnterBackground put pongo una imagen superpuesta que será capturada por el sistema operativo, y una vez que la aplicación entre en primer plano, eliminaré la superposición. No estoy seguro de si esto va a funcionar, pero estoy en camino de implementarlo. Mientras tanto, cualquier otro pensamiento sobre esto me ayudará a averiguar la forma óptima de atacar este problema.

Author: Nisse Engström, 2011-09-22

7 answers

Estás en el camino correcto. Esta es la forma recomendada de Apple para hacer esto como se indica en la Guía de programación de Aplicaciones de iOS :

Elimine la información confidencial de las vistas antes de pasar al segundo plano. Cuando una aplicación pasa al fondo, el sistema toma una instantánea de la ventana principal de la aplicación, que luego presenta brevemente cuando la aplicación vuelve al primer plano. Antes de regresar de su método applicationDidEnterBackground:, debe ocultar u ocultar contraseñas y otra información personal confidencial que pueda capturarse como parte de la instantánea.

 25
Author: Ole Begemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 14:25:09

Necesita escribir el código en los métodos de ciclo de vida de la aplicación, aquí estamos poniendo un imageView mientras la aplicación se anima en segundo plano:

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

Aquí está el código para eliminar el imageView:

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

Está funcionando y probado correctamente.

 13
Author: Deepak Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 10:55:18

Me encontré con el mismo problema, y mi investigación me ha llevado a las siguientes respuestas:

  • Establezca una superposición de pantalla borrosa antes de que la aplicación pase a segundo plano y, una vez que la aplicación se active, elimine esta superposición

  • Si es iOS 7 o posterior, puede usar la función ignoreSnapshotOnNextApplicationLaunch

Ver en apple documentación: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

Espero que esto ayude a alguien.
 10
Author: Lily,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-12 16:44:46

Su enfoque es exactamente la forma correcta y única de hacerlo. Coloque una vista de superposición y elimínela más tarde. Es válido hacer esto si su aplicación muestra datos confidenciales que no desea que se almacenen en caché en formato de imagen en cualquier lugar.

 5
Author: Krumelur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-22 19:28:09

Mejora en Depak Kumar post : Hacer una propiedad 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
Author: Xeieshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 08:27:21

En iOS 7 puedes usar el allowScreenShot para detener la habilidad todos juntos.

Ver: Desarrollador de Apple: Referencia del Perfil de configuración :

allowScreenShot


Booleano
Opcional. Si se establece en false, los usuarios no pueden guardar una captura de pantalla de la pantalla y se les impide capturar una grabación de pantalla; también impide que la aplicación Aula observe pantallas remotas. El valor predeterminado es true.

Disponibilidad: Actualizado en iOS 9.0 para incluir pantalla grabación.

 0
Author: Michael Bazzoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-22 22:51:49

En swift 4 App delegate declaré

    var imageview : UIImageView?

func applicationWillResignActive(_ application: UIApplication) {

        imageview = UIImageView.init(image: UIImage.init(named: "bg_splash"))
        self.window?.addSubview(imageview!)
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

func applicationDidBecomeActive(_ application: UIApplication) {
        if (imageview != nil){

            imageview?.removeFromSuperview()
            imageview = nil
        }
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
 0
Author: Ourang-Zeb Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 21:18:52