在进入后台之前阻止iOS获取应用程序的屏幕截图

大家可能都知道,iOS会在将应用程序投入后台之前进行屏幕截图。 这通常是为了更好的用户体验,比如快速animation来带回应用程序等等。 我不希望我的应用程序屏幕截图存储在设备上,但我希望多任务仍然存在。

我提出了一个解决scheme,但我不确定我是否正朝着正确的方向前进。 所以,当applicationDidEnterBackground被调用的时候 – 我放入一个覆盖图片,这个图片会被操作系统捕获,一旦应用程序进入前台,我将删除覆盖图。 我不确定这是否会起作用,但我正在实施这个方法。 同时,对此的任何其他想法将帮助我找出攻击这个问题的最佳方式。

你在正确的轨道上。 这是苹果推荐的方式, 正如iOS应用程序编程指南中所述 :

在移至背景之前,从视图中移除敏感信息。 当应用程序转换到后台时,系统会拍摄应用程序主窗口的快照,然后在将应用程序转换回前台时,该窗口会短暂显示。 在从applicationDidEnterBackground:方法返回之前,您应该隐藏或遮掩可能作为快照一部分捕获的密码和其他敏感个人信息。

需要在应用程序生命周期方法中编写代码,这里我们将应用程序放到背景上时放置一个imageView

 -(void)applicationWillResignActive:(UIApplication *)application { imageView = [[UIImageView alloc]initWithFrame:[self.window frame]]; [imageView setImage:[UIImage imageNamed:@"Splash_Screen.png"]]; [self.window addSubview:imageView]; } 

这里是删除imageView的代码:

 - (void)applicationDidBecomeActive:(UIApplication *)application { if(imageView != nil) { [imageView removeFromSuperview]; imageView = nil; } } 

它正在工作并经过适当的testing。

我遇到了同样的问题,我的研究让我得到以下答案:

  • 在应用程序进入后台之前设置一个模糊的屏幕覆盖,一旦应用程序变为活动,删除此覆盖

  • 如果是iOS 7或更高版本,则可以使用ignoreSnapshotOnNextApplicationLaunchfunction

请参阅苹果文档: https : //developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

我希望这有助于某人。

你的方法是完全正确和唯一的方法来做到这一点。 放置覆盖视图并稍后删除。 如果您的应用程序显示您不希望以任何forms的图像格式caching的敏感数据,则可以这样做。

在iOS 7中,您可以使用allowScreenShot将所有function停下来。

请参阅: Apple开发人员:configuration文件参考 :

allowScreenShot


布尔


可选的。 如果设置为false ,则用户不能保存显示的屏幕截图,并且不能捕获屏幕logging; 它也阻止了Classroom应用程序观察远程屏幕。 默认为true

可用性:在iOS 9.0中更新,包含屏幕录像。

改善Depak库马尔后:做一个属性UIImage *snapShotOfSplash;

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch]; snapShotOfSplash =[UIImage imageNamed:@"splash_logo"]; } - (void)applicationDidEnterBackground:(UIApplication *)application { self.overlayView = [[UIImageView alloc]initWithFrame:[self.window frame]]; self.overlayView.backgroundColor = [UIColor whiteColor]; [self.overlayView setImage:snapShotOfSplash]; [self.overlayView setContentMode:UIViewContentModeCenter]; [self.window addSubview:self.overlayView]; [self.window bringSubviewToFront:self.overlayView]; } - (void)applicationDidBecomeActive:(UIApplication *)application { if(self.overlayView != nil) { [self.overlayView removeFromSuperview]; self.overlayView = nil; } }