iOS iMessage扩展截屏检测

17

请使用Swift 4+

注意:我在iMessage扩展程序中检测截图,而不是在标准的iMessage视图中。

更新 - 我想出了一个可行的解决方案,在敏感信息期间每0.3秒左右检查照片库,以检查是否添加了新的屏幕截图。如果用户没有给予照片库权限,它将不会向他们显示内容,直到他们启用它。然而,我仍在寻找其他创造性的解决方案,不一定涉及如此繁琐的过程。

我有一个iMessage扩展程序,正在尝试检测截图。我尝试了我在网上找到的每个观察者,但出于某种原因它没有注册截图。

ViewWillAppear()

UIScreen.main.addObserver(self, forKeyPath: "captured", options: .new, context: nil)

观察者模式
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
    if (keyPath == "captured") {
        let isCaptured = UIScreen.main.isCaptured
        print(isCaptured)
        screenshot()
        //screenshot() sends a message alerting the message was screens hotted. However, the print statement didn't even run.
    }
}

ViewWillDisappear()

UIScreen.main.removeObserver(self, forKeyPath: "captured", context: nil)

我也尝试了标准默认的通知中心

let mainQueue = OperationQueue.main
    NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
        // executes after screenshot
        print("Screenshotted")
        self.screenshot()
    }

有人声称无法在iMessage扩展中检测截屏,因为它只是一个扩展而不是完整的应用程序。但是,这位开发者已经成功地做到了。 工作示例


你的问题不太清楚,你打算如何在用户没有安装扩展程序的情况下检测到他们截屏了一条消息? - Tom
@Tom 我使用了UIApplication.userDidTakeScreenshotNotification。这两个是一样的吗?我认为这只是更新后的版本。 - Levi K
@Tom 好的,我会研究一下,不确定它是否有效。 - Levi K
1
@Tom 谢谢!我无法让它工作,但希望其他人有解决方案。 - Levi K
已经为您完成了! :) - Tom
显示剩余9条评论
1个回答

1
也许这有点过头了,但你可以将图像转换为受DRM保护的视频,系统会防止任何对DRM保护的视频进行截屏、屏幕共享或屏幕录制。

我该怎么做?我不确定我完全理解你的意思。 - Levi K
FairPlay是一种DRM技术,用于保护您的视频内容免受盗窃(Widevine是另一个例子)。iOS在系统级别上不允许对此类内容进行截屏/录制视频(在截屏的情况下,只会显示黑屏)。因此,您可以呈现受保护的视频而不是图像。 - ManWithBear
如果你只想知道是否已经截屏,那么这可能会非常繁琐。但是,如果你想完全防止截屏,这可能是最好的方法。 - ManWithBear
那似乎是一个相当不错的想法,唯一的问题是我正在展示文本,而不是照片。所以试图将文本转换成静态视频可能有点过头了,哈哈。 - Levi K
@LeviK,你知道吗,文本只是一堆像素而已 :D - ManWithBear
我知道 :) 但我认为我想出的解决方案现在可以工作,我可能会尝试稍后实现更复杂的解决方案。谢谢你的建议! - Levi K

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