iOS 11如何像Netflix一样防止屏幕录制

9

我的应用程序中有视频播放,我不希望被记录下来。像Netflix应用程序一样,在屏幕录制时允许音频捕获但不允许视频被捕获。

有人知道如何实现这个功能吗?


请告诉我更多关于它的信息?你的问题缺乏解释。 - Zeeshan
我只是简单地不希望新的iOS功能“屏幕录制”在我的应用程序播放视频时录制视频。Netflix允许您在其应用程序中录制视频,但一旦您播放任何电影,他们只允许录制音频,对于视频,他们只会在视频播放之前放置最后一个捕获的视频帧。 - Shuja
5个回答

5
你可以监听 UIScreenCapturedDidChange 通知。
NotificationCenter.default.addObserver(self, selector: #selector(screenCaptureChanged), name: NSNotification.Name.UIScreenCapturedDidChange, object: nil)

当iOS 11屏幕录制开始和结束时,会调用此功能。当用户正在录制屏幕时,可以修改UI以阻止任何不想录制的内容。

UIScreenisCaptured属性更改时,将触发此通知。您也可以自己检查此属性:

UIScreen.main.isCaptured

5
我认为,Netflix利用了由苹果提供的“FairPlay Streaming”技术。根据苹果文档的介绍:

如果您的应用程序使用FairPlay Streaming(FPS),则iOS 11屏幕录制功能或macOS上的QuickTime Player将自动不捕获您的视频内容。播放内容的部分将变黑。

注意:FairPlay Streaming仅为您的内容的视频部分提供保护。要防止音频部分被捕获,您仍应使用本文档中讨论的UIScreen API向用户提供适当的消息,如果屏幕捕获开始。

您可以从以下链接深入了解FPS: https://developer.apple.com/streaming/fps/ 任何应用程序都可以使用FPS来实现与Netflix相同的效果。

这绝对是预期的回应。谢谢 - undefined

1
我创建了一个黑色视图,并将其添加到UIWindow的顶部。然后,在PlayerVideo的视图控制器中,创建观察者: NotificationCenter.default.addObserver(self, selector: #selector(screenCaptureChanged), name: NSNotification.Name.UIScreenCapturedDidChange, object: nil) 然后,在screenCaptureChanged方法中:
(void) screenCaptureChanged {
if (@available(iOS 11.0, *)) {
    BOOL isCaptured = [[UIScreen mainScreen] isCaptured];

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

}

这个解决方案将在用户录制时阻止PlayerVideo。但是,我想创建像Netflix一样的功能。我希望用户在观看电影时可以自由操作。如果他们正在录制,他们可以继续观看视频而不会出现黑屏。然而,当他们停止录制时,视频将保存为黑屏视图。我还在研究Netflix是如何做到这一点的。

你找到了像 Netflix 一样的解决方案吗? - vnaren001
请在此处查看我的答案:https://dev59.com/LKXja4cB1Zd3GeqPPVJa#56005122 - Gurdeep

0
你只需要在你的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
有一个特定的问题。如果我在主屏幕上开始屏幕录制,然后打开应用程序,它就无法工作。 它无法检测到这种情况,我们该怎么办??? - zsubzwary

0

Netflix的解决方案与代码无关。它被称为DRM或数字版权管理。它保护数据免受任何盗版,包括屏幕录制/截图和下载。这真是太昂贵了。


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