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

时间:2011-09-22 19:07:52

标签: iphone ios ipad multitasking

你们可能都知道iOS在将应用程序投射到后台之前会对其进行屏幕截图。这通常是为了获得更好的用户体验,例如快速动画来恢复应用程序等等。我不希望我的应用程序屏幕截图存储在设备上,但我希望多任务仍然存在。

我提出了一个解决方案,但我不确定我是否朝着正确的方向前进。因此,当调用applicationDidEnterBackground时 - 我会放入一个将由操作系统捕获的叠加图像,一旦应用程序进入前景,我将删除叠加层。我不确定这是否会起作用,但我正在实现这一目标。同时,对此的任何其他想法将帮助我找出攻击此问题的最佳方式。

10 个答案:

答案 0 :(得分:29)

你走在正确的轨道上。这是Apple推荐的方法as noted in the iOS Application Programming Guide

  

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

答案 1 :(得分:14)

需要在应用程序生命周期方法中编写代码,这里我们在应用程序为背景设置动画时放置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;
    }
}

它正在运行并经过适当测试。

答案 2 :(得分:10)

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

  • 在应用进入后台之前设置模糊的屏幕叠加层,一旦应用变为活动状态,请移除此叠加层

  • 如果是iOS 7或更高版本,您可以使用该功能 ignoreSnapshotOnNextApplicationLaunch

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

我希望这有助于某人。

答案 3 :(得分:5)

您的方法是完全正确且唯一的方法。放置叠加视图,稍后将其删除。如果您的应用显示您不希望在任何地方以图像格式缓存的敏感数据,则执行此操作是有效的。

答案 4 :(得分:2)

Apple Doc https://developer.apple.com/library/archive/qa/qa1838/_index.html

注意:您的-applicationDidEnterBackground实现:不应该启动任何动画(将NO传递给任何animated:参数)。从此方法返回后,将立即捕获应用程序窗口的快照。在拍摄快照之前,动画不会完成。

转换的Apple代码在swift 4.2 App委托中声明

SELECT `b`.`Path` AS `Path`,
       `b`.`Data` AS `Data`,
       `b`.`Actual Create Date`
    FROM `SIM_FE_Audit_Data` `b`
 WHERE `b`.`IssueId` NOT IN 
       (SELECT `b2`.`IssueId` 
          FROM `SIM_FE_Audit_Data` `b2` 
          WHERE `b2`.`Actual Create Date` = `b`.`Actual Create Date` 
            AND `b2`.`Data` = 'Comment' 
            AND `b`.`Data` = 'Open'
            AND `b`.IssueId <> `b2`.IssueId)

答案 5 :(得分:1)

Depak Kumar帖子的改进: 创建一个属性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;
    }
}

答案 6 :(得分:0)

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

请参阅:Apple Developer: Configuration Profile Reference

  

allowScreenShot   

<小时/>   布尔   
  可选的。如果设置为false,则用户无法保存显示屏的屏幕截图,并且无法捕获屏幕录制内容;它还可以防止Classroom应用程序观察远程屏幕。默认为true

     

可用性:在iOS 9.0中进行了更新,以包含屏幕录制。

答案 7 :(得分:0)

AppDelegate中的工作方法,迅速4.2:

export class AppComponent {
...
static parameters = [BsModalService];

constructor(private modalService: BsModalService)

位置:

func blurScreen(style: UIBlurEffect.Style = UIBlurEffect.Style.regular) {
    screen = UIScreen.main.snapshotView(afterScreenUpdates: false)
    let blurEffect = UIBlurEffect(style: style)
    let blurBackground = UIVisualEffectView(effect: blurEffect)
    screen?.addSubview(blurBackground)
    blurBackground.frame = (screen?.frame)!
    window?.addSubview(screen!)
}

func removeBlurScreen() {
    screen?.removeFromSuperview()
}

在所需的委托方法中调用这些方法:

weak var screen : UIView? = nil // property of the AppDelegate

答案 8 :(得分:0)

在后台和反向动作中执行一些动画

   - (void)applicationWillResignActive:(UIApplication *)application
{
     //     fill screen with our own colour
        UIView *colourView = [[UIView alloc]initWithFrame:self.window.frame];
        colourView.backgroundColor = [UIColor blackColor];
        colourView.tag = 1111;
        colourView.alpha = 0;
        [self.window addSubview:colourView];
        [self.window bringSubviewToFront:colourView];

        // fade in the view
        [UIView animateWithDuration:0.5 animations:^{
            colourView.alpha = 1;
        }];

}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // grab a reference to our coloured view
    UIView *colourView = [self.window viewWithTag:1111];
    // fade away colour view from main view
    [UIView animateWithDuration:0.5 animations:^{
        colourView.alpha = 0;
    } completion:^(BOOL finished) {
        // remove when finished fading
        [colourView removeFromSuperview];
    }];

 }

答案 9 :(得分:0)

swift 4.0版本。

用于使用自定义图标

首先将此行添加到AppDelegate的顶部

var imageView: UIImageView?

并添加以下内容:

func applicationDidEnterBackground(_ application: UIApplication) {
    imageView = UIImageView(frame: window!.frame)
    imageView?.image = UIImage(named: "AppIcon")
    window?.addSubview(imageView!)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    if imageView != nil {
        imageView?.removeFromSuperview()
        imageView = nil
    }
}

黑色背景

func applicationDidEnterBackground(_ application: UIApplication) {
    let blankViewController = UIViewController()
    blankViewController.view.backgroundColor = UIColor.black
    window?.rootViewController?.present(blankViewController, animated: false)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    window?.rootViewController?.dismiss(animated: false)
}