出于安全原因,我需要防止我的应用程序的用户进行屏幕截图。我显示的内容是机密的,不应复制到设备上。我在 Stack Overflow 上看到了一个答案,但适用于 Android。
是否有可能在 iOS 中以某种方式阻止屏幕捕获?
虽然通过单击几个按钮将屏幕截图捕获到图库中对用户来说是一个非常有用的功能,但也有一个有限的要求来阻止它。任何指针?
出于安全原因,我需要防止我的应用程序的用户进行屏幕截图。我显示的内容是机密的,不应复制到设备上。我在 Stack Overflow 上看到了一个答案,但适用于 Android。
是否有可能在 iOS 中以某种方式阻止屏幕捕获?
虽然通过单击几个按钮将屏幕截图捕获到图库中对用户来说是一个非常有用的功能,但也有一个有限的要求来阻止它。任何指针?
我刚刚编写了 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 如何在内部发挥这种魔力,我将不胜感激。
没有办法完全阻止截屏。您可以做Snapchat所做的事情,即要求用户触摸屏幕以查看您正在显示的任何信息。这是因为系统截图事件中断了触摸。这不是一个完美的方法,你不能阻止用户 100% 的时间截取屏幕截图。
更多详细信息:iOS 检测屏幕截图?
已经有一段时间了,但我刚刚遇到了ScreenShieldKit,这是消息应用程序 Confide 使用的一项正在申请专利的技术。它的作用是让用户截取屏幕截图,但最终图片上的内容是空白的。他们最近发布了 iOS 版本。
在移至后台之前从视图中删除敏感信息。当应用程序转换到后台时,系统会拍摄应用程序主窗口的快照,然后在将应用程序转换回前台时简要显示该快照。在从您的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.
}
我听说您可以使用 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];
}];
如果您可以在制作截图文件时立即删除它会怎样?