In arka planda çalışmasına Kişisel UI Hazırlama Apple diyor ki:
Kullanıcı Arayüzünüzü Uygulama Anlık Görüntüsü için Hazırlayın
Uygulamanız arka plana girdikten ve temsilci yönteminiz döndükten bir noktada, UIKit, uygulamanızın mevcut kullanıcı arayüzünün anlık görüntüsünü alır. Sistem, ortaya çıkan görüntüyü uygulama değiştiricide görüntüler. Ayrıca, uygulamanızı ön plana getirirken resmi geçici olarak görüntüler.
Uygulamanızın kullanıcı arayüzü, şifreler veya kredi kartı numaraları gibi hassas kullanıcı bilgileri içermemelidir. Arayüzünüz bu tür bilgiler içeriyorsa, arka plana girerken bu bilgileri görünümlerinizden kaldırın. Ayrıca, uygulamanızın içeriğini gizleyen uyarıları, geçici arayüzleri ve sistem görünümü denetleyicilerini kapatın. Anlık görüntü, uygulamanızın arayüzünü temsil eder ve kullanıcılar tarafından tanınabilmelidir. Uygulamanız ön plana döndüğünde, verileri ve görünümleri uygun şekilde geri yükleyebilirsiniz.
Bkz. Teknik Soru ve Cevap QA1838: Hassas Bilgilerin Görev Değiştiricide Görünmesini Önleme
Hassas bilgileri gizlemeye / değiştirmeye ek olarak, iOS 7'ye ignoreSnapshotOnNextApplicationLaunch, dokümantasyonunda şunlar yazan ekran anlık görüntüsünü almamasını söylemek isteyebilirsiniz :
Uygulamanız yeniden başlatıldığında ignoreSnapshotOnNextApplicationLaunchanlık görüntünün , uygulamanızın kullanıcı arayüzünü doğru şekilde yansıtamayacağını düşünüyorsanız, bu anlık görüntünün alınmasını önlemek için arama yapabilirsiniz .
Bunu söyledikten sonra, ekran görüntüsü hala alınmış gibi görünüyor ve bu nedenle bir hata raporu verdim. Ancak daha fazla test yapmalı ve bu ayarı kullanmanın yardımcı olup olmadığına bakmalısınız.
Bu bir kurumsal uygulama olsaydı , Yapılandırma Profili Başvurusu'nun Sınırlamalar Yükü bölümünde allowScreenShotbelirtilen uygun ayarı da incelemek isteyebilirsiniz .
İşte ihtiyacım olanı gerçekleştiren bir uygulama. UIImageViewGizli bilgileri gizlemek için kendinizinkini sunabilir veya bir temsilci protokolü modelini kullanabilirsiniz:
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
Daha sonra uygulama temsilcisine bunun için bir mülk verdim:
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
Görünüm denetleyicim bunu ayarlar:
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
Görünüm denetleyicisi açıkça bu protokolü uygular:
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
Ve son olarak, uygulama temsilcim bu protokol ve özellikten yararlanır:
- (void)applicationWillResignActive:(UIApplication *)application
{
[application ignoreSnapshotOnNextApplicationLaunch];
[self.secureDelegate hide:@"applicationWillResignActive:"];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self.secureDelegate show:@"applicationDidBecomeActive:"];
}
Not, applicationWillResignActivetavsiye edilen yerine kullanıyorum applicationDidEnterBackground, çünkü diğerlerinin de belirttiği gibi, uygulama çalışırken ana sayfa düğmesine iki kez dokunduğunuzda ikincisi çağrılmaz.
Temsilci protokol modeli yerine tüm bunları işlemek için bildirimleri kullanabilmeyi diliyorum, ancak sınırlı testimde bildirimler yeterince zamanında ele alınmıyor, ancak yukarıdaki model iyi çalışıyor.