Ao preparar sua IU para execução em segundo plano , a Apple diz:
Prepare sua IU para o instantâneo do aplicativo
Em algum ponto depois que seu aplicativo entra em segundo plano e seu método delegado retorna, o UIKit tira um instantâneo da interface de usuário atual do seu aplicativo. O sistema exibe a imagem resultante no alternador de aplicativos. Ele também exibe a imagem temporariamente ao trazer seu aplicativo de volta ao primeiro plano.
A IU do seu aplicativo não deve conter nenhuma informação sensível do usuário, como senhas ou números de cartão de crédito. Se sua interface contiver essas informações, remova-as de suas visualizações ao inserir o plano de fundo. Além disso, ignore alertas, interfaces temporárias e controladores de visualização do sistema que obscurecem o conteúdo do seu aplicativo. O instantâneo representa a interface do seu aplicativo e deve ser reconhecível pelos usuários. Quando seu aplicativo retornar ao primeiro plano, você pode restaurar dados e visualizações conforme apropriado.
Consulte Perguntas e respostas técnicas QA1838: Como evitar que informações confidenciais apareçam no alternador de tarefas
Além de ocultar / substituir informações confidenciais, você também pode pedir ao iOS 7 para não tirar o instantâneo da tela por meio de ignoreSnapshotOnNextApplicationLaunch
, cuja documentação diz:
Se você achar que o instantâneo não pode refletir corretamente a interface do usuário do seu aplicativo quando o aplicativo for reiniciado, você pode chamar ignoreSnapshotOnNextApplicationLaunch
para evitar que a imagem do instantâneo seja obtida.
Dito isso, parece que o instantâneo da tela ainda foi tirado e, portanto, apresentei um relatório de bug. Mas você deve testar mais e ver se o uso dessa configuração ajuda.
Se este era um aplicativo corporativo, você também pode querer olhar para a configuração apropriada allowScreenShot
descrita na seção Restrictions Payload da Configuration Profile Reference.
Aqui está uma implementação que atinge o que eu precisava. Você pode apresentar o seu próprio UIImageView
ou pode usar um padrão de protocolo de delegado para ocultar as informações confidenciais:
// SecureDelegate.h
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
Em seguida, dei ao meu delegado de aplicativo uma propriedade para isso:
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
Meu controlador de visualização define:
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
O controlador de visualização obviamente implementa esse protocolo:
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
E, finalmente, o delegado do meu aplicativo se vale deste protocolo e propriedade:
- (void)applicationWillResignActive:(UIApplication *)application
{
[application ignoreSnapshotOnNextApplicationLaunch]; // this doesn't appear to work, whether called here or `didFinishLaunchingWithOptions`, but seems prudent to include it
[self.secureDelegate hide:@"applicationWillResignActive:"]; // you don't need to pass the "object", but it was useful during my testing...
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self.secureDelegate show:@"applicationDidBecomeActive:"];
}
Observe, estou usando applicationWillResignActive
em vez do recomendado applicationDidEnterBackground
, porque, como outros apontaram, este último não é chamado ao tocar duas vezes no botão home enquanto o aplicativo está em execução.
Eu gostaria de poder usar notificações para lidar com tudo isso, em vez do padrão de protocolo de delegado, mas em meus testes limitados, as notificações não são tratadas em tempo hábil o suficiente, mas o padrão acima funciona bem.