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

Iphone 防止iOS在进入后台之前捕获应用程序的屏幕,iphone,ios,ipad,multitasking,Iphone,Ios,Ipad,Multitasking,大家可能都知道,iOS在将应用程序放到后台之前会先对其进行屏幕截图。这通常是为了获得更好的用户体验,比如快速播放动画以恢复应用程序等。我不希望我的应用程序屏幕截图存储在设备上,但我希望多任务处理仍然存在 我想出了一个解决办法,但我不确定我是否朝着正确的方向前进。因此,当调用ApplicationIdentinterBackground时,我放入一个覆盖图像,该图像将由操作系统捕获,一旦应用程序进入前台,我将移除覆盖图像。我不确定这是否可行,但我在路上要实现这一点。同时,关于这一点的任何其他想法都

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


我想出了一个解决办法,但我不确定我是否朝着正确的方向前进。因此,当调用ApplicationIdentinterBackground时,我放入一个覆盖图像,该图像将由操作系统捕获,一旦应用程序进入前台,我将移除覆盖图像。我不确定这是否可行,但我在路上要实现这一点。同时,关于这一点的任何其他想法都将帮助我找到解决这一问题的最佳方法。

您的方法正是解决这一问题的正确且唯一的方法。放置覆盖视图,稍后将其删除。如果你的应用程序显示了你不想在任何地方以图像格式缓存的敏感数据,那么这样做是有效的

你走在正确的轨道上。这是苹果公司推荐的方法:

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


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

在应用程序进入后台之前设置模糊屏幕覆盖,一旦应用程序处于活动状态,则删除此覆盖

如果是iOS 7或更高版本,则可以使用该功能
忽略SnapshotOnExtApplicationLaunch

请参阅apple文档中的:


我希望这对某些人有所帮助。

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

见:

allowScreenShot 布尔值 可选择的如果设置为false,则用户无法保存屏幕截图,并且无法捕获屏幕记录;它还防止教室应用程序观察远程屏幕。默认为true

可用性:在iOS 9.0中更新,包括屏幕录制


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

-(void)applicationWillResignActive:(UIApplication *)application
{
    imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [imageView setImage:[UIImage imageNamed:@"Splash_Screen.png"]];
    [self.window addSubview:imageView];
}
以下是删除imageView的代码:


它正在工作并经过适当测试。

德帕克·库马尔邮政的改进: 制作属性UIImage*snapShotOfSplash

苹果医生

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

我声明的swift 4.2应用程序代理中转换的苹果代码


AppDelegate中的工作方法,swift 4.2:

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
在所需的委托方法中调用这些方法:

func applicationWillResignActive(_ application: UIApplication) {
    blurScreen()
}

func applicationDidBecomeActive(_ application: UIApplication) {
    removeBlurScreen()
}

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

   - (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];
    }];

 }
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
    }
}
黑色背景


你为什么不想让iOS这么做?正如你自己所说,截图是用来执行快速动画…我有用户的机密数据。。所以有一些第三方工具,比如iphoneexplorer,你可以进入iOS文件系统提取图像。我不想对这些数据妥协。。。因此,我计划实施这种方法。这种方法非常有效。。谢谢大家!这个截图将存储在操作系统拍摄的iPhone中的什么位置@MobileWits您知道这些屏幕截图临时存储在设备上的什么位置吗?/Library/Caches/Snapshots/$BUNDLE\u IDENTIFIER/是应用程序沙盒中的路径。顺便说一下,你可以使用Xcode的DeviceManager下载你的应用程序沙盒容器。它现在不是应该是applicationWillResignActive吗?ignoreSnapshotOnNextApplicationLaunch听起来很有趣,但这并不妨碍iOS在任何情况下截屏,对吗?我没有在iOS 8中尝试过这个功能,但在iOS 7中并没有阻止截图。我这里有问题。无论我做什么,我都无法阻止应用程序捕捉错误的窗口,它说:…调用此方法让UIKit知道它应该使用应用程序的默认启动映像,而不是快照。您必须从用于保留应用程序状态的代码中调用此方法。从上面继续往下说,最后一行是踢球者。在我的应用程序WillResignActive回调中简单地调用它是不起作用的。然而,我不太清楚苹果是什么意思
通过您用于保留应用程序状态的代码。听起来它们是指您用于在重启后保持状态的代码,但图像未针对iPad进行标记。请注意,显示警报对话框时也会调用“applicationWillResignActive”。当您想显示此imageview时可能不是。在iOS 11中对此进行了测试。。。它不起作用间歇性链接不起作用,不是简单地粘贴链接吗?@ParikksitBhisay我意识到它很老了,但我想说的是,因为我来这里是为了处理垃圾邮件,这是一个简短的,可能不好的答案,但这是一个答案;它提到了所需的属性。这仅在设备处于配置管理下时可用-例如在企业环境中,它不适用于普通AppSturtApp.它仍然在工作,你可以发送屏幕截图当应用程序是在后台?它的工作方式,它真的创建一个子视图等,但窗口的大小已经很小的时候,我可以添加它,从而导致一个矩形在中间,我的观点出现在快照,但不覆盖全屏幕。我最终按文档中的建议推送了一个启动屏幕控制器,然后将其删除…顺便说一句,我在这里使用的是启动屏幕图像。它说找不到您要查找的页面。这很接近,但在显示UIAlertController时将不起作用。使用://enterBackground[self.window addSubview:self.splashView];//输入前景[self.splashView removeFromSuperview];将与UIAlertControllert一起使用样式中存在错误:UIBlurEffect.style=UIBlurEffect.style.regular子句。样式不是UIBlurEffect的成员类型。
   - (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];
    }];

 }
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)
}