防止在iOS应用程序中捕获屏幕

防止在iOS应用程序中捕获屏幕,ios,screenshot,Ios,Screenshot,出于安全原因,我需要防止我的应用程序用户截屏。我显示的内容是保密的,不应复制到设备上。我看见了 在iOS中是否可能以某种方式阻止屏幕捕获 虽然通过点击几个按钮将屏幕截图捕获到图库中对用户来说是一个非常有用的功能,但防止截图的要求也很有限。有什么建议吗?没有办法完全阻止截图。您可以做Snapchat所做的事情,即要求用户触摸屏幕以查看您显示的任何信息。这是因为系统屏幕截图事件会中断触摸。这不是一个完美的方法,你不能阻止用户100%的时间截图 更多详细信息:一种可能的解决方法是。我刚看了这个演示,让

出于安全原因,我需要防止我的应用程序用户截屏。我显示的内容是保密的,不应复制到设备上。我看见了

在iOS中是否可能以某种方式阻止屏幕捕获

虽然通过点击几个按钮将屏幕截图捕获到图库中对用户来说是一个非常有用的功能,但防止截图的要求也很有限。有什么建议吗?

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


更多详细信息:

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

这是一个非常聪明的方法来掩盖截图,甚至部分处理JimBobBennet提出的“wetware”案件

你在图像顶部设置了一个模糊遮罩(应用程序中使用了栅栏图案,但任何图案都可以),然后快速移动。如果用户拍摄了一张屏幕截图,他们会得到一帧的静止图像,而这帧图像本身是模糊的

它利用了这样一个事实,即我们的大脑可以在一个移动的面具后面拼凑出一幅图像——就像你可以“看穿”一个移动风扇的叶片一样

为了捕获图像,您需要录制一段视频,这是一件相当麻烦的事情


这里唯一的问题可能是IP-Yovo声称有…

我听说您可以使用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];
                                              }];

如果你能在制作截图文件时立即删除它会怎么样?

已经有一段时间了,但我刚刚发现,这是一项正在申请专利的技术,由消息应用程序“机密”使用。它所做的是让用户拍摄屏幕截图,但最终图片上的内容是空白的。他们最近发布了iOS版本

在移动到视图之前,从视图中删除敏感信息 背景。当应用程序转换到后台时 系统对应用程序的主窗口进行快照,然后 然后在将应用程序转换回 前景。从应用程序返回之前,请确认身份背景: 方法,则应隐藏或隐藏密码和其他敏感信息 可能作为快照的一部分捕获的个人信息

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

我刚刚编写了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()
   }
}


如果有人能解释一下苹果内部是如何发挥这一魔力的,我将不胜感激。

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

这是操作系统级别的操作,因此我认为这是不可能的,除非您在越狱设备上运行。我可能错了。我不认为你可以在非越狱设备上阻止它,但你可以检测到它——另一个问题是湿软件中的屏幕捕获——就像一个人用其他设备(如照相机或其他手机)捕获屏幕一样。即使你在应用程序中阻止它,也不可能阻止某人在屏幕上拍照。有没有办法检测块中捕获的图像并使其模糊?我已经看到一些安全框架这样做,但我不知道它们具体做什么,但肯定有一些系统呼叫拦截。截图中的人在我看来很容易辨认。这只是隐私的一个小幻觉。是的,效果取决于用例。在你想防止用户窃取内容的情况下,这将使任务变得烦人和乏味——这可能是一个足够合适的威慑。但你仍然可以看到模糊遮罩在原始图像右侧快速移动/动画(即使你没有截图)?你仍然可以拍摄一些屏幕截图,当面具移动时,你可以将其与我认为2或3个带有围栏图案的屏幕截图拼接在一起。癫痫警告…我不使用Snapchat,所以现在无法测试它,但是如果你将iPhone插入Mac并通过Xcode拍摄屏幕截图,会发生什么?(手指一直在屏幕上)。我很确定没有程序化的方法来检测(更不用说阻止)这样的屏幕截图了……你怎么删除这个文件?这是不可能的。我不太熟悉ios的开发,但在android上,若用户允许访问gallery,你们可以在那个里创建和删除文件。所以我认为你可以立即删除截图。虽然这可能不会帮助你阻止截图,但这是一个很好的方法,可以跟踪是否有人截图,以及这个问题在你的应用程序中有多普遍。如果您的应用程序使用登录机制,您可以识别用户并限制应用程序访问或向用户提供通知(如果需要)。我在一个应用程序中实现了这一点,用户正在拍摄屏幕截图,但数量太少,不足以保证进行预防。如果该用户将分享拍摄的屏幕截图呢?@Baddingtoncat有可能,但是用户权限是必需的,它需要采用他们的自定义UI元素,因为它通过使用将视图转换为视频来进行保护DRM@CameronLowellPalmer你怎么知道他们在使用数字版权管理?如果你深入研究他们的二进制文件,你会发现他们在做视频转码,整个事情是很明显的。苹果根据版权法为视频层提供保护。是的@AbdulYasin请分享你的最佳解决方案事实上,没有这样的方法可以阻止截图