iOS 截屏&录屏 检测

1,772 阅读1分钟

首先,我们需要判断目前屏幕是否正在进行录制,然后注册录屏和截屏的通知进行相应的事件处理。

    //检查是否“屏幕录制中”
    let screen = UIScreen.main
        if screen.isCaptured {
            self.screenshotAlert()
        }       

添加录屏和截图的通知

NotificationCenter.default.addObserver(self,
                                       selector: #selector(screenshotAlert),
                                       name: UIApplication.userDidTakeScreenshotNotification,
                                       object: nil)
NotificationCenter.default.addObserver(self,
                                       selector: #selector(screenshotAlert),
                                       name: UIScreen.capturedDidChangeNotification,
                                       object: nil)

添加要处理的信息

    @objc func screenshotAlert() {
            let alert = UIAlertController.init(title: "提示",
                                        message: "[安全提醒]不要截图,录屏或分享给他人以保障账户安全。",
                                        preferredStyle: .alert)
            let cancleAction = UIAlertAction.init(title: "好的",
                                                  style: .cancel,
                                                  handler: nil)
            alert.addAction(cancleAction)
            self.present(alert, animated: true, completion: nil)
        }

这样不能防止截图和录屏,只能做提醒使用。如果需要防止截图到敏感信息可以使用系统的UITextField作为父视图 凡是添加到这个视图上的子视图都不能被截图获取到。

/// 防止截图的父层view; 凡是放在这个视图上的子视图都能防止截图
/// - Returns:
public func makeSecView() -> UIView {
    let field = UITextField()
    field.isSecureTextEntry = true
    guard let view = field.subviews.first else {
        return UIView()
    }
    view.subviews.forEach { $0.removeFromSuperview() }
    view.isUserInteractionEnabled = true
    return view
}