Dalam Mempersiapkan UI Anda untuk Berjalan di Latar Belakang , Apple mengatakan:
Siapkan UI Anda untuk App Snapshot
Di beberapa titik setelah aplikasi Anda memasuki latar belakang dan metode delegasi Anda kembali, UIKit mengambil snapshot dari antarmuka pengguna aplikasi Anda saat ini. Sistem menampilkan gambar yang dihasilkan di pengalih aplikasi. Ini juga menampilkan gambar untuk sementara saat membawa aplikasi Anda kembali ke latar depan.
UI aplikasi Anda tidak boleh berisi informasi pengguna yang sensitif, seperti sandi atau nomor kartu kredit. Jika antarmuka Anda berisi informasi seperti itu, hapus dari tampilan Anda saat memasuki latar belakang. Selain itu, tutup peringatan, antarmuka sementara, dan pengontrol tampilan sistem yang mengaburkan konten aplikasi Anda. Snapshot tersebut mewakili antarmuka aplikasi Anda dan harus dapat dikenali oleh pengguna. Saat aplikasi Anda kembali ke latar depan, Anda bisa memulihkan data dan tampilan sebagaimana mestinya.
Lihat T&J Teknis QA1838: Mencegah Informasi Sensitif Muncul di Pengalih Tugas
Selain mengaburkan / mengganti informasi sensitif, Anda mungkin juga ingin memberi tahu iOS 7 untuk tidak mengambil cuplikan layar melalui ignoreSnapshotOnNextApplicationLaunch
, yang dokumentasinya mengatakan:
Jika Anda merasa bahwa snapshot tidak dapat dengan benar mencerminkan antarmuka pengguna aplikasi Anda saat aplikasi Anda diluncurkan kembali, Anda dapat memanggil ignoreSnapshotOnNextApplicationLaunch
untuk mencegah pengambilan gambar snapshot tersebut.
Karena itu, tampaknya snapshot layar masih diambil dan oleh karena itu saya telah mengajukan laporan bug. Tetapi Anda harus menguji lebih lanjut dan melihat apakah menggunakan pengaturan ini membantu.
Jika ini adalah aplikasi perusahaan, Anda mungkin juga ingin melihat pengaturan yang sesuai yang allowScreenShot
diuraikan di bagian Batasan Muatan dari Referensi Profil Konfigurasi.
Berikut adalah implementasi yang mencapai apa yang saya butuhkan. Anda dapat mempresentasikan milik Anda sendiri UIImageView
, atau Anda dapat menggunakan pola protokol-delegasi untuk mengaburkan informasi rahasia:
// SecureDelegate.h
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
Saya kemudian memberikan properti kepada delegasi aplikasi saya untuk itu:
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
Pengontrol tampilan saya menyetelnya:
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
Pengontrol tampilan jelas mengimplementasikan protokol itu:
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
Dan, akhirnya, delegasi aplikasi saya memanfaatkan protokol dan properti ini:
- (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:"];
}
Catatan, saya menggunakan applicationWillResignActive
daripada yang disarankan applicationDidEnterBackground
, karena, seperti yang ditunjukkan orang lain, yang terakhir tidak dipanggil saat mengetuk dua kali tombol beranda saat aplikasi sedang berjalan.
Saya berharap saya dapat menggunakan pemberitahuan untuk menangani semua ini, daripada pola protokol-delegasi, tetapi dalam pengujian terbatas saya, pemberitahuan tidak ditangani secara tepat waktu, tetapi pola di atas berfungsi dengan baik.