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

Mob*_*its 28 iphone multitasking ipad ios

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

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

Ole*_*ann 29

你走在正确的轨道上.这是Apple推荐的方法,如iOS应用程序编程指南中所述:

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

  • `/ Library/Caches/Snapshots/$(BUNDLE_IDENTIFIER)/`是应用程序沙箱中的路径. (2认同)

小智 15

需要在应用程序生命周期方法中编写代码,这里我们将imageView应用程序的动画放到后台:

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

这是删除以下代码imageView:

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

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


Lil*_*ily 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

我希望这有助于某人.

  • (上接上)现在,最后一行是关键。简单地在我的 applicationWillResignActive 回调中调用它是行不通的。然而,我不太确定苹果所说的“**你用来保存应用程序状态的代码。**”是什么意思。 (2认同)

Kru*_*lur 6

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


Agi*_*ght 5

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()
}
Run Code Online (Sandbox Code Playgroud)

哪里:

weak var screen : UIView? = nil // property of the AppDelegate
Run Code Online (Sandbox Code Playgroud)

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

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

func applicationDidBecomeActive(_ application: UIApplication) {
    removeBlurScreen()
}
Run Code Online (Sandbox Code Playgroud)