ios - teclado - donde se guardan las capturas de pantalla en mac
Mostrar una vista o pantalla de bienvenida antes de applicationDidEnterBackground(para evitar la captura de pantalla de la vista activa) (8)
Tengo información confidencial en mi aplicación, por lo que me gustaría ocultarla con una pantalla de inicio cuando la aplicación está a punto de moverse a segundo plano.
Ejecuto la aplicación en iOS6 y más.
Traté de mostrar la vista en applicationWillResignActive
pero el problema es que muestra la pantalla de bienvenida, incluso cuando el panel de control desliza el dedo, por ejemplo. Quiero que se muestre solo cuando la aplicación se mueva a segundo plano.
Traté de mostrar mi splashScreen en applicationDidEnterBackground
pero toma la captura de pantalla antes para que la información se muestre en la restauración durante la animación.
Aquí el espíritu de lo que quiero:
- (void)applicationDidEnterBackground:(UIApplication *)application {
[_window addSubview:__splashController.view];
}
Creo que el problema es que estás probando en el simulador . En el dispositivo, debería funcionar bien.
Probé esto y funcionó. Agregue una vista de imagen con su imagen de bienvenida cuando la aplicación ingrese en segundo plano -
- (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];
}
Y cuando la aplicación vuelve a estar en primer plano,
- (void)applicationWillEnterForeground:(UIApplication *)application
{
UIImageView *imageView = (UIImageView *)[UIApplication.sharedApplication.keyWindow.subviews.lastObject viewWithTag:101]; // search by the same tag value
[imageView removeFromSuperview];
}
NOTA - En el simulador (iOS 7.0), la subvista agregada no se muestra al marcar presionando el botón de inicio dos veces (Cmd + H), pero en el dispositivo funciona como se esperaba (como paypal
, aplicaciones de BofA
)
EDITAR: (Información adicional)
Además de oscurecer / reemplazar información confidencial al agregar subvista / desenfoque como se explicó anteriormente, iOS 7 le brinda la capacidad de ignorar la captura de pantalla mediante ignoreSnapshotOnNextApplicationLaunch
de UIApplication
dentro de 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);
Además, el indicador allowScreenShot
se puede explorar en Restrictions Payload .
Creo que esto ayudará a 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()
}
}
Esto me lo arregló, lo siento por Xamarin.Forms, pero deberías tener la idea. Debe llamar a UIView.SnapshotView (true) en xamarin o UIView snapshotViewAfterScreenUpdates
en iOS. Funciona en DidEnterBackground en iOS7 y iOS8:
public override void DidEnterBackground(UIApplication uiApplication)
{
App.Current.MainPage = new DefaultPage();
**UIApplication.SharedApplication.KeyWindow.SnapshotView(true);**
base.DidEnterBackground(uiApplication);
}
Necesita escribir el código de la siguiente manera:
-(void)applicationWillResignActive:(UIApplication *)application
{
imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
[imageView setImage:[UIImage imageNamed:@"Portrait(768x1024).png"]];
[self.window addSubview:imageView];
}
Aquí para eliminar la vista de la imagen:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(imageView != nil) {
[imageView removeFromSuperview];
imageView = nil;
}
}
Está funcionando y probado adecuadamente.
No sé por qué, pero ninguno de los métodos descritos aquí funcionó para mí. Simplemente estaba tratando de cubrir la pantalla por razones de seguridad. Entonces, lo que ayudó fue un Q & A Técnico de Apple: https://developer.apple.com/library/ios/qa/qa1838/_index.html
Supongo que la principal diferencia es usar un UIViewController? De todos modos, el siguiente código funciona perfectamente para mí en 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];
}
Tenía el mismo problema, esencialmente estaba usando applicationDidEnterBackground
para mostrar una UIWindow sobre el contenido, pero en iOS8 no funcionaba como lo hizo en iOS7.
La solución que encontré fue para crear la ventana UI en applicationWillResignActive
pero hacerla oculta securityWindow.hidden = YES
; y luego en applicationDidEnterBackground
todo lo que haría sería cambiar securityWindow.hidden = NO
.
Esto parece funcionar exactamente como iOS7 oscureciendo el contenido cuando se realizan múltiples tareas sin afectar la vista al usar NotificationCenter o ControlPanel.
Swift 3.0 Respuesta para aquellos que son perezosos para traducir.
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