2011-09-22 151 views
20

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

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

+0

为什么你不想要的iOS做到这一点的原因吗?正如你所说,截图是采取执行快速动画... –

+1

我有用户的机密数据..所以有一些第三方工具,如iPhone浏览器,你可以进入iOS文件系统并提取图像。我不想妥协这些数据...因此我计划实施这种方法。 – Mobilewits

+0

这种方法完美无缺。谢谢大家! – Mobilewits

回答

24

你是在正确的轨道上。这是苹果公司推荐的方法as noted in the iOS Application Programming Guide

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

+1

您是否知道设备上的这些屏幕截图临时存储在哪里? – Bazze

+2

'/ Library/Caches/Snapshots/$(BUNDLE_IDENTIFIER)/'是应用程序沙箱中的路径。 –

+1

顺便说一下,您可以使用Xcode的DeviceManager下载应用程序sandbox-container。 –

5

你的方法是正确的唯一方法。放置覆盖视图并稍后删除。如果您的应用程序显示您不希望以任何形式在图像格式中缓存的敏感数据,则可以这样做。

9

我遇到了同样的问题,我的研究使我如下回答:

  • 设定一个模糊的屏幕覆盖的应用进入后台之前,一旦应用程序被激活删除这个覆盖

  • 如果是iOS 7以上版本,你可以使用函数 ignoreSnapshotOnNextApplicationLaunch

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

我希望这有助于某人。

+0

ignoreSnapshotOnNextApplicationLaunch听起来很有趣,但这并不妨碍iOS在任何情况下都会截图,对吧? – saxos

+0

我还没有尝试iOS 8中的这个功能,但在iOS 7中并没有阻止截屏。 – Lily

+0

我在这里遇到问题。无论我做什么,我都无法停止应用程序快照不正确的窗口。 [在此页面](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch),It Sayeth:“。调用这种方法让UIKit知道它应该使用你的应用程序的默认启动镜像而不是快照 **你必须在你使用的代码中调用这个方法来保存你的应用程序的状态。续) –

0

在iOS 7中,您可以使用allowScreenShot来一起停止此功能。

参见:Apple Developer: Configuration Profile Reference

allowScreenShot


布尔
可选。如果设置为 false,用户将无法保存屏幕截图并且无法捕获屏幕录制;它也阻止了Classroom应用程序观察远程屏幕。默认为 true

可用性: iOS 9.0更新,包括屏幕录像。

+0

链接不起作用,是不是它不是简单地粘贴链接? –

+0

@ParikksitBhisay(我意识到这是非常古老的,但我想提到,因为我在这里处理垃圾邮件无论如何)这是一个简短的,可能是坏的答案,但它是一个答案;它提到了所需的财产。 –

11

需要编写的应用程序生命周期方法的代码,在这里我们把一个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; 
    } 
} 

它正在工作和正确测试。

+0

但该图像未被iPad分配。 –

+0

当显示警告对话框时,还要小心“applicationWillResignActive”。当你想显示这个imageview可能不是。 – lostintranslation

+0

在iOS 11中测试了这个...它不是间歇性地工作 – user1872384

1

改善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; 
    } 
}