에서 백그라운드에서 실행 귀하의 UI를 준비 , 애플은 말한다 :
앱 스냅 샷을위한 UI 준비
앱이 백그라운드로 들어가고 델리게이트 메서드가 반환 된 후 UIKit은 앱의 현재 사용자 인터페이스에 대한 스냅 샷을 생성합니다. 시스템은 앱 전환기에 결과 이미지를 표시합니다. 또한 앱을 포 그라운드로 되돌릴 때 일시적으로 이미지를 표시합니다.
앱의 UI에는 비밀번호 나 신용 카드 번호와 같은 민감한 사용자 정보가 포함되어서는 안됩니다. 인터페이스에 이러한 정보가 포함되어 있으면 백그라운드로 들어갈 때보기에서 제거하십시오. 또한 앱의 콘텐츠를 가리는 경고, 임시 인터페이스 및 시스템보기 컨트롤러를 닫습니다. 스냅 샷은 앱의 인터페이스를 나타내며 사용자가 인식 할 수 있어야합니다. 앱이 포 그라운드로 돌아 오면 데이터와 뷰를 적절하게 복원 할 수 있습니다.
기술 Q & A QA1838 : 작업 전환기에 민감한 정보가 나타나지 않도록 방지를 참조하십시오 .
민감한 정보를 모호하게 / 바꾸는 것 외에도을 통해 화면 스냅 샷을 찍지 않도록 iOS 7에 지시 할 수 있습니다 ignoreSnapshotOnNextApplicationLaunch
.
앱이 다시 시작될 때 스냅 샷이 앱의 사용자 인터페이스를 올바르게 반영 할 수 없다고 생각되면을 호출 ignoreSnapshotOnNextApplicationLaunch
하여 해당 스냅 샷 이미지가 생성되지 않도록 할 수 있습니다 .
그럼에도 불구하고 화면 스냅 샷이 여전히 촬영 된 것으로 보이므로 버그 보고서를 제출했습니다. 그러나 추가로 테스트하고이 설정을 사용하는 것이 도움이되는지 확인해야합니다.
엔터프라이즈 앱인 경우 구성 프로필 참조allowScreenShot
의 제한 페이로드 섹션에 설명 된 적절한 설정을 살펴볼 수도 있습니다 .
여기 내가 필요한 것을 달성하는 구현이 있습니다. 자신의을 제시 UIImageView
하거나 위임 프로토콜 패턴을 사용하여 기밀 정보를 가릴 수 있습니다.
// SecureDelegate.h
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
그런 다음 내 앱 위임에 해당 속성을 부여했습니다.
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
내 뷰 컨트롤러가 설정합니다.
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
뷰 컨트롤러는 분명히 해당 프로토콜을 구현합니다.
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
그리고 마지막으로 내 앱 델리게이트는이 프로토콜과 속성을 자체적으로 사용합니다.
- (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:"];
}
다른 사람들이 지적했듯이 앱이 실행되는 동안 홈 버튼을 두 번 탭할 때 후자가 호출되지 않기 때문에 applicationWillResignActive
권장되는 대신 사용 applicationDidEnterBackground
하고 있습니다.
위임 프로토콜 패턴이 아닌 알림을 사용하여이 모든 것을 처리 할 수 있기를 원하지만 제한된 테스트에서는 알림이 적시에 충분히 처리되지 않지만 위의 패턴은 정상적으로 작동합니다.