防止在iOS应用中捕获屏幕

zol*_*lio 27 screenshot ios

出于安全原因,我需要阻止我的应用用户截屏.我显示的内容是保密的,不应复制到设备上.我在Stack Overflow上看到了一个答案,但对于Android.

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

通过点击几个按钮将屏幕截图捕获到图库中对于用户来说是一个非常有用的功能,但是对它的预防也是有限的.有什么指针吗?

Jos*_*oss 15

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

更多细节:iOS检测截图?

  • 我不使用Snapchat,所以现在无法测试,但是如果将iPhone插入Mac并通过Xcode截屏会怎样?(手指始终在屏幕上)。我敢肯定,没有办法以编程方式来_detect_(更不用说_prevent_)这种屏幕捕获了... (2认同)

Jim*_*ett 15

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

  • 这是非常有趣的一点。希望在大多数应用程序(例如,DRM的音频和视频)中,固有的数据降级足以起到抑制作用-但是,您还是可以使用磁带将电影院屏幕上的录像带... (2认同)

Ism*_*ani 13

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

http://vimeo.com/108244650

这是掩盖屏幕截图的一种非常聪明的方式,甚至可以部分处理由JimBobBennet提出的"wetware"案例.

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

它使用了这样一个事实,即我们的大脑可以将动态面具后面的图像拼凑在一起 - 类似于您可以"透视"移动风扇的刀片.

为了捕获图像,您需要录制它的视频,这非常麻烦.

这里唯一的问题可能是IP - Yovo声称拥有300多项专利 ......


ora*_*ull 11

我刚刚编写了 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

class ViewController: UIViewController {

   var secureView: UIView!

   override func viewDidLoad() {
      super.viewDidLoad()

      secureView.makeSecure()
   }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能会导致几个问题,我建议不要这样做。如果您的图层还有其他子图层(例如自定义视图),那么这很可能会崩溃,具体取决于您的实现。 (18认同)
  • 还应该注意的是,这仅适用于 iOS 13+ (6认同)
  • @orakull `_UITextLayoutCanvasView` 负责隐藏东西(参见https://gist.github.com/damian-rzeszot/bbfd92895dfe9400ba9a7cf2a0c1e670) (5认同)
  • 我不再看到这种方法在 iOS 17 上起作用。有人找到了替代方法吗? (5认同)
  • `field.layer.sublayers?.last?.addSublayer(self.layer)` 似乎适用于 iOS17 (3认同)

Onu*_*vik 8

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

  • 它需要采用他们的自定义 UI 元素,因为它通过使用 DRM 将视图转换为视频来保护 (9认同)
  • 如果你深入研究他们的二进制文件,你会发现他们正在做视频转码,整个事情很明显。Apple 根据版权法为视频层提供保护。 (7认同)

Our*_*han 6

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

在Swift 4中,将此代码添加到您的应用程序委托中。

在应用程序委托中声明一个变量

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

  • 这与问题无关 (5认同)
  • 此代码在 iOS 版本 13.3.1 的 xcode11.3 中无法正常工作 (5认同)