如何防止实际的UI内容出现在屏幕截图中?[复制]

How to Prevent the Actual UI Content from Appearing in a Screenshot? [duplicate]

提问人:Naveen Kumar 提问时间:10/20/2023 更新时间:10/20/2023 访问量:60

问:

我需要做的操作是当用户尝试拍摄屏幕截图时,用其他一些 UI 限制实际的 UI,但是当我尝试拍摄屏幕截图时,这里会出现红色阻止器视图,但保存的图像具有实际的 ui 内容如何克服这个问题。

任何人都可以帮助我实现这一点,就像您是否看到任何不允许截屏的支付或安全应用程序一样,但这里需要允许,但我们需要覆盖实际的 ui 呈现在分部视图中。

class HomeViewController: UIViewController {
    
    private var greetLabel: UILabel!
    
    private let navigator: HomeNavigator
    
    init(navigator: HomeNavigator) {
        self.navigator = navigator
        super.init(nibName: nil, bundle: nil)
        setupTabBar()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationBar()
        setupViews()
        setupConstraints()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        NotificationCenter.default.addObserver(self, selector: #selector(handleScreenshot), name: UIApplication.userDidTakeScreenshotNotification, object: nil)
      }
      
      override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
          NotificationCenter.default.removeObserver(self, name: UIApplication.userDidTakeScreenshotNotification, object: nil)
      }
      
   
    @objc func handleScreenshot() {
        let blockerView = ScreenshotBlockerView(frame: UIScreen.main.bounds)
        if let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) {
            keyWindow.addSubview(blockerView)
        }

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.removeScreenshotBlockerView()
        }
    }
    
    
    func removeScreenshotBlockerView() {
        if let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) {
            for subview in keyWindow.subviews {
                if subview is ScreenshotBlockerView {
                    subview.removeFromSuperview()
                }
            }
        }
    }
    
    private func setupNavigationBar() {
        navigationItem.title = "Home"
        self.navigationItem.largeTitleDisplayMode = .never
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "",style: .plain,target: nil,action: nil)
    }
    
    private func setupTabBar() {
        let tabBarItem = UITabBarItem(title: "Home", image: UIImage(systemName: "house") , tag: 0)
        tabBarItem.selectedImage = UIImage(systemName: "house.fill")
        self.tabBarController?.tabBar.barTintColor =  UIColor.blue
        self.tabBarItem = tabBarItem
    }
    
    private func setupViews() {
        view.backgroundColor = .white
        
        let greetLabel = UILabel()
        greetLabel.numberOfLines = 0
        greetLabel.font = UIFont.systemFont(ofSize: 18 , weight: UIFont.Weight.semibold)
        greetLabel.textColor = UIColor.black
        greetLabel.translatesAutoresizingMaskIntoConstraints = false
        greetLabel.text = AppConstants.shared.greetLabelText(forType: .itemConstant)
        
        self.greetLabel = greetLabel
        
        view.addSubview(greetLabel)
        
    }
    
    private func setupConstraints() {
        NSLayoutConstraint.activate([
            self.greetLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            self.greetLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        ])
    }
}

class ScreenshotBlockerView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = UIColor.red
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

iOS Swift iPhone 截图

评论

0赞 Paulw11 10/20/2023
屏后,您正在放置阻止视图 - 用户确实采取了屏幕截图。在截屏之前,没有通知告诉您
0赞 Naveen Kumar 10/20/2023
没关系,@Paulw11某些网上银行应用程序具有我在截屏后询问的功能,保存的图像没有实际的 UI,它看起来有点像图像本身中的“拒绝操作”,有什么办法可以做到这一点。
0赞 HangarRash 10/20/2023
这些搜索结果中还有很多其他可能性。

答:

1赞 Tokarev 10/20/2023 #1

AFAIK 目前这是不可能的。在实际屏幕截图发生之前,我们没有办法接收事件,我们可以对此做出反应。截屏后只有一个事件。

https://screenshieldkit.com/我读到这家公司有一个可行的解决方案,但它需要付款。它们有一个自定义 UI 组件,用于在截屏时隐藏视图。他们通过使用DRM以某种方式将视图转换为视频来做到这一点

评论

0赞 Naveen Kumar 10/20/2023
谢谢你的回复!,我会检查的。