如何在iOS应用中禁用屏幕录制

8

有没有办法禁用屏幕录制?或者可以通过配置文件来实现吗?或者是否有任何第三方库可用?


@PyaePhyoeShein 没有使用 blockView 的解决方案吗? - Alok Maurya
那么 self.view.backgroundColor = UIColor.red 怎么样?还是其他什么? - PPShein
不要打断我的应用用户体验。只有我的应用可以避免屏幕录制吗? - Alok Maurya
1
显示带有警告的覆盖弹出窗口是最好的。 - PPShein
4个回答

12
NotificationCenter.default.addObserver(self, selector: #selector(preventScreenRecording), name: NSNotification.Name.UIScreenCapturedDidChange, object: nil)

创建一个主视图内的子视图并避免这种情况。

(void) preventScreenRecording {
if (@available(iOS 11.0, *)) {
    BOOL isCaptured = [[UIScreen mainScreen] isCaptured];

    if (isCaptured) {
        self.blockView.hidden = false;
    }
    else {
        self.blockView.hidden = true;
    }
}

能否解释一下这里的 blockView 是什么?我相信这个方法是在截图被捕获后被调用的。我还没有测试过。 - NightFury
@PPShein 有没有办法禁用截屏? - Sagar Daundkar
@NightFury blockView 是您想要禁用屏幕录制的区域。 - PPShein
@SagarDaundkar 我认为这应该和我之前提到的一样。 - PPShein
你能否写出完整的代码?谢谢。 - dontknowhy
请查看以下链接 https://dev59.com/LKXja4cB1Zd3GeqPPVJa#71170751,其中包含完整的代码。 - midhun p

4
当您的应用程序启动时,可以测试 UIScreen.isCaptured 属性,如果设置为 true,则显示一些闪屏屏幕。
您还应该观察(在某个地方订阅)capturedDidChangeNotification 通知,并在 UIScreen.isCaptured 设置为 true 时执行相同操作(显示闪屏屏幕)。

我能够使用UIScreen.isCaptured检测屏幕录制。如何在不影响用户体验的情况下避免我的应用程序被屏幕录制。 - Alok Maurya

2

Swift 4及以上版本

您只需在Appdelegate.swift页面进行以下更改。

当用户尝试录制屏幕时,它会自动在应用程序顶部添加一个模糊视图。

weak var screen : UIView? = nil

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    NotificationCenter.default.addObserver(self, selector: #selector(preventScreenRecording), name: UIScreen.capturedDidChangeNotification, object: nil)
    return true
}

@objc func preventScreenRecording() {
    let isCaptured = UIScreen.main.isCaptured
    print("isCaptured: \(isCaptured)")
    if isCaptured {
        blurScreen()
    }
    else {
        removeBlurScreen()
    }
}

func blurScreen(style: UIBlurEffect.Style = UIBlurEffect.Style.regular) {
    screen = UIScreen.main.snapshotView(afterScreenUpdates: false)
    let blurEffect = UIBlurEffect(style: style)
    let blurBackground = UIVisualEffectView(effect: blurEffect)
    screen?.addSubview(blurBackground)
    blurBackground.frame = (screen?.frame)!
    window?.addSubview(screen!)
}

func removeBlurScreen() {
    screen?.removeFromSuperview()
}

1
sharedRecorder.stopRecording( handler: { previewViewController, error in    
    if let error = error {
        print("\(error.localizedDescription)")
    }
    if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
        previewViewController?.modalPresentationStyle = UIModalPresentationStyle.popover
        previewViewController?.popoverPresentationController?.sourceRect = CGRect.zero
        previewViewController?.popoverPresentationController?.sourceView = self.view
    }
    if previewViewController != nil {
        self.previewViewController = previewViewController
        previewViewController?.previewControllerDelegate = self
    }
    self.present(previewViewController!, animated: true, completion: nil)
    })
    return
}



https://developer.apple.com/documentation/replaykit/rpscreenrecorder/1620990-stoprecording

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接