屏幕截图的 iOS 检测? ?

应用程序商店上的应用程序 阅后即焚是一个应用程序,可以让你分享带有自毁功能的图片。您只能查看 X 秒的图片。如果你试图在图片显示时使用家用电源键组合来截屏,它会告诉发件人你试图截屏。

SDK 的哪一部分可以让您检测到用户正在截屏?我不知道这是可能的。

125361 次浏览

似乎没有直接的方法来检测用户是否点击了 home + power button。根据 这个,使用达尔文通知是可能的,但是它不再起作用了。既然 Snapchat 已经在这么做了,我猜测他们正在检查 iPhone 的相册,以检测在这10秒内是否有新的图片被添加进来,并且以某种方式与当前显示的图片进行比较。可能是一些图像处理做了这样的比较。只是一个想法,也许你可以尝试扩展这一点,使其工作。检查 详情请浏览此网页

编辑:

看起来他们可能正在检测 UITouch 取消事件(屏幕捕获取消接触) ,并按照这个 blog 向用户显示这个错误消息: 如何在 iOS (如 SnapChat)上检测屏幕截图

在这种情况下,您可以使用 – touchesCancelled:withEvent:方法来检测 UITouch 取消来检测这一点。您可以删除此委托方法中的图像,并向用户显示适当的警报。

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];


NSLog(@"Touches cancelled");


[self.imageView removeFromSuperView]; //and show an alert to the user
}

我找到答案了!截屏会打断屏幕上的任何触摸。这就是为什么快照需要等待才能看到图片。参考资料: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat

从 iOS7开始,其他的答案不再正确。苹果公司已经做到这一点,所以 touchesCancelled:withEvent:不再调用时,用户需要一个屏幕截图。

这将有效地彻底破坏 Snapchat,因此在新的解决方案中添加了几个 beta 版本。现在,解决方案就像使用 NSNotificationCenter 向 通知添加观察器一样简单。

这里有一个例子:

目标 C

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
object:nil
queue:mainQueue
usingBlock:^(NSNotification *note) {
// executes after screenshot
}];

斯威夫特

NotificationCenter.default.addObserver(
forName: UIApplication.userDidTakeScreenshotNotification,
object: nil,
queue: .main) { notification in
//executes after screenshot
}

以下是如何在 Swift 中使用闭包:

func detectScreenShot(action: () -> ()) {
let mainQueue = NSOperationQueue.mainQueue()
NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationUserDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
// executes after screenshot
action()
}
}


detectScreenShot { () -> () in
print("User took a screen shot")
}

Swift 4.2

func detectScreenShot(action: @escaping () -> ()) {
let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
// executes after screenshot
action()
}
}

这是作为一项标准职能列入的:

Https://github.com/goktugyil/ezswiftextensions

免责声明: 这是我的回购

最新 SWIFT 3:

func detectScreenShot(action: @escaping () -> ()) {
let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot, object: nil, queue: mainQueue) { notification in
// executes after screenshot
action()
}
}

ViewDidLoad中,调用这个函数

detectScreenShot { () -> () in
print("User took a screen shot")
}

但是,

NotificationCenter.default.addObserver(self, selector: #selector(test), name: .UIApplicationUserDidTakeScreenshot, object: nil)


func test() {
//do stuff here
}

完全正常,我没看到任何 mainQueue 的点..。

Swift 4例子

示例 # 1使用闭包

NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: OperationQueue.main) { notification in
print("\(notification) that a screenshot was taken!")
}

示例 # 2使用选择器

NotificationCenter.default.addObserver(self,
selector: #selector(screenshotTaken),
name: .UIApplicationUserDidTakeScreenshot,
object: nil)


@objc func screenshotTaken() {
print("Screenshot taken!")
}

Swift 4 +

NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in
//you can do anything you want here.
}

通过使用这个观察者,你可以知道用户什么时候截屏,但是你不能阻止他。