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

发布于 2024-12-06 04:33:33 字数 283 浏览 0 评论 0原文

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

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

You all might know that iOS takes a screen shot of your application before throwing it into the background. This is usually for a better User experience like quick animation to bring the app back and so on. I don't want my app screen shot to be stored on the device, but I want the multitasking to still exist.

I came out with a solution but I'm not sure if I'm heading in the right direction. So, when the applicationDidEnterBackground is called -- I put in an overlay image that will be captured by the OS, and once the app enters foreground, I will remove the overlay. I'm not sure if this is going to work but I'm on my way to implement this. Meanwhile, any other thoughts on this will help me figure out the optimal way of attacking this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

许一世地老天荒 2024-12-13 04:33:33

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

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

You are on the right track. This is Apple's recommended way to do this as noted in the iOS Application Programming Guide:

Remove sensitive information from views before moving to the background. When an application transitions to the background, the system takes a snapshot of the application’s main window, which it then presents briefly when transitioning your application back to the foreground. Before returning from your applicationDidEnterBackground: method, you should hide or obscure passwords and other sensitive personal information that might be captured as part of the snapshot.

雪花飘飘的天空 2024-12-13 04:33:33

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

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

Need to write the code in Application life cycle methods, here we are putting an imageView while the app animate to background :

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

Here is the code to remove the imageView:

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

It is working and properly tested.

旧情别恋 2024-12-13 04:33:33

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

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

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

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

我希望这对某人有帮助。

I came across the same issue, and my research has lead me to the following answers:

  • set a blurry screen overlay before the app goes in the background and once the app becomes active remove this overlay

  • if it is iOS 7 or later you can use the function
    ignoreSnapshotOnNextApplicationLaunch

See in apple documentation:
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

I hope this helps somebody.

宣告ˉ结束 2024-12-13 04:33:33

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

Working methods in 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()
}

Where is:

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

Call these methods in needed delegate methods:

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

func applicationDidBecomeActive(_ application: UIApplication) {
    removeBlurScreen()
}
满栀 2024-12-13 04:33:33

你的方法是完全正确的,也是唯一的方法。放置一个覆盖视图并稍后将其删除。如果您的应用程序显示您不希望以图像格式缓存的敏感数据,则执行此操作是有效的。

Your approach is exactly the correct and only way to do it. Place an overlay view and remove it later. It is valid to do this if your app shows sensitive data that you don't want to be cached in image format anywhere.

羁客 2024-12-13 04:33:33

苹果文档
https://developer.apple.com/library/archive/qa/ qa1838/_index.html

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

在我声明的 swift 4.2 应用程序委托中转换了 Apple 代码

func applicationDidEnterBackground(_ application: UIApplication) {
    // Your application can present a full screen modal view controller to
    // cover its contents when it moves into the background. If your
    // application requires a password unlock when it retuns to the
    // foreground, present your lock screen or authentication view controller here.

    let blankViewController = UIViewController()
    blankViewController.view.backgroundColor = UIColor.black

    // Pass NO for the animated parameter. Any animation will not complete
    // before the snapshot is taken.
    window.rootViewController?.present(blankViewController, animated: false)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // This should be omitted if your application presented a lock screen
    // in -applicationDidEnterBackground:
    window.rootViewController?.dismiss(animated: false) false
}

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

Note: Your implementation of -applicationDidEnterBackground: should not start any animations (pass NO to any animated: parameter). The snapshot of your application's window is captured immediately upon returning from this method. Animations will not complete before the snapshot is taken.

Converted Apple code in swift 4.2 App delegate i declared

func applicationDidEnterBackground(_ application: UIApplication) {
    // Your application can present a full screen modal view controller to
    // cover its contents when it moves into the background. If your
    // application requires a password unlock when it retuns to the
    // foreground, present your lock screen or authentication view controller here.

    let blankViewController = UIViewController()
    blankViewController.view.backgroundColor = UIColor.black

    // Pass NO for the animated parameter. Any animation will not complete
    // before the snapshot is taken.
    window.rootViewController?.present(blankViewController, animated: false)
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // This should be omitted if your application presented a lock screen
    // in -applicationDidEnterBackground:
    window.rootViewController?.dismiss(animated: false) false
}
苏大泽ㄣ 2024-12-13 04:33:33

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

Improvement in Depak Kumar post :
Make a property 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;
    }
}
懵少女 2024-12-13 04:33:33

在后台和反向操作时使用一些动画实现

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

 }

Implementation with some animation while going in background and reverse action

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

 }
自在安然 2024-12-13 04:33:33

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

swift 4.0 version.

for use custom icon

first add this line at top of AppDelegate

var imageView: UIImageView?

and add this:

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

background with black color

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)
}
人生戏 2024-12-13 04:33:33

在 iOS 7 中,您可以使用 allowScreenShot 来完全停止该功能。

请参阅: Apple 开发者:配置文件参考

allowScreenShot

<小时>
布尔值
<小时>
选修的。如果设置为 false,用户将无法保存显示的屏幕截图,并且无法捕获屏幕录制;它还会阻止“课堂”应用程序观察远程屏幕。默认为true

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

In iOS 7 you could use the allowScreenShot to stop the ability all together.

See: Apple Developer: Configuration Profile Reference:

allowScreenShot


Boolean


Optional. If set to false, users can’t save a screenshot of the display and are prevented from capturing a screen recording; it also prevents the Classroom app from observing remote screens. Defaults to true.

Availability: Updated in iOS 9.0 to include screen recordings.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文