防止在iOS应用中捕获屏幕

时间:2013-09-08 03:13:12

标签: ios screenshot

出于安全原因,我需要阻止我的应用用户截屏。我显示的内容是保密的,不应复制到设备上。我看到了one answer on Stack Overflow, but for Android

iOS中是否有可能阻止屏幕捕获?

通过点击几个按钮将屏幕截图捕捉到画廊中对用户来说是一个非常有用的功能,但是也有一个有限的要求来防止它。有什么指针吗?

9 个答案:

答案 0 :(得分:15)

另一个问题是湿软件中的屏幕捕获 - 就像一个人用另一个设备(如相机或其他手机)捕获屏幕一样。即使你在应用程序中阻止它,也不可能阻止有人拍摄屏幕照片

答案 1 :(得分:14)

没有方法可以防止完全截屏。您可以执行 Snapchat 所做的操作,即要求用户触摸屏幕以查看您正在显示的任何信息。这是因为系统屏幕截图事件会中断触摸。这不是一个完美的方法,你不能阻止用户100%的时间截图。

更多详情:iOS Detection of Screenshot?

答案 2 :(得分:13)

一种可能的解决方法是Yovo。我刚刚看到这个演示让我大吃一惊!

http://vimeo.com/108244650

这是一种非常聪明的方式来模糊屏幕截图,甚至可以部分处理" wetware"由JimBobBennet提出的案件。

您在图像顶部设置了模糊遮罩(在应用程序中使用了栅栏模式,但任何模式都可以),并以快速移动它。如果用户截取屏幕截图,则会获得单个帧的静止图像,这个图像本身就会被遮挡。

它使用了这样一个事实:我们的大脑可以将动态面具后面的图像拼凑在一起 - 类似于你如何能够看到"透视"移动风扇的叶片。

为了拍摄图像,您需要录制一段视频,这非常麻烦。

这里唯一的问题可能是IP - Yovo声称拥有300+ patents ......

答案 3 :(得分:8)

  

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

在swift 4中,将此代码添加到您的应用代理中。

在app delegate中声明一个变量

var imageview : UIImageView?

func applicationWillResignActive(_ application: UIApplication) {

        imageview = UIImageView.init(image: UIImage.init(named: "bg_splash"))
        self.window?.addSubview(imageview!)
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

func applicationDidBecomeActive(_ application: UIApplication) {
        if (imageview != nil){

            imageview?.removeFromSuperview()
            imageview = nil
        }
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

答案 4 :(得分:5)

我刚刚编写了 UIView 的简单扩展,允许将其隐藏在屏幕捕获、Airplay 镜像等中。该解决方案使用 UITextField 的功能来隐藏密码以防止捕获。

extension UIView {
    func makeSecure() {
        DispatchQueue.main.async {
            let field = UITextField()
            field.isSecureTextEntry = true
            self.addSubview(field)
            field.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
            field.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
            self.layer.superlayer?.addSublayer(field.layer)
            field.layer.sublayers?.first?.addSublayer(self.layer)
        }
    }
}

使用:

class ViewController: UIViewController {

   var secureView: UIView!

   override func viewDidLoad() {
      super.viewDidLoad()

      secureView.makeSecure()
   }
}

如果有人解释 Apple 如何在内部实现这种魔力,我将不胜感激。

答案 5 :(得分:3)

已经有一段时间了,但我刚遇到ScreenShieldKit,这是一项正在申请专利的消息应用Confide所使用的技术。它的作用是让用户截取屏幕截图,但内容在最终图片上是空白的。他们最近发布了iOS版本。

答案 6 :(得分:2)

我听说您可以使用UIApplicationUserDidTakeScreenshotNotification来监听屏幕截图事件

 NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
                                                  object:nil
                                                   queue:mainQueue
                                              usingBlock:^(NSNotification *note) {
                                                  // executes after screenshot
                                                  NSLog(@"Screenshot Detection : %@", note);
                                                  UIAlertView *screenshotAlert = [[UIAlertView alloc] initWithTitle:@"Screenshot Detected" message:@"Oh Oh no screenshot bruhh" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                                                  [screenshotAlert show];
                                              }];

如果您可以在制作屏幕截图文件时立即将其删除,该怎么办?

答案 7 :(得分:0)

如果应用程序具有授权,也许可以detect the screenshot newly takendelete it

但是,如果要阻止用户获取包含敏感信息的屏幕截图,则应尝试一下。这不是一个好习惯,并且不能完全阻止用户这样做。

答案 8 :(得分:0)

我还能想到的另一个极端解决方法是将您的图像转换为视频格式并启用 DRM。然后您可以在显示时循环“图像”以减小文件大小。