该应用程序Snapchat,在App Store上,是一个应用程序,可以让你分享他们自毁图片。您只能查看图片X秒钟。如果您在显示图片时使用家庭电源键组合拍摄屏幕截图,则会告诉发送者您尝试拍摄屏幕截图。
SDK的哪一部分可让您检测到用户正在截屏?我不知道这是可能的。
该应用程序Snapchat,在App Store上,是一个应用程序,可以让你分享他们自毁图片。您只能查看图片X秒钟。如果您在显示图片时使用家庭电源键组合拍摄屏幕截图,则会告诉发送者您尝试拍摄屏幕截图。
SDK的哪一部分可让您检测到用户正在截屏?我不知道这是可能的。
Answers:
我找到答案了!截屏会中断屏幕上的所有触摸。这就是为什么手套需要握住才能看到图片的原因。参考:http : //tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
从iOS 7开始,其他答案不再正确。苹果已经做到了,所以touchesCancelled:withEvent:
当用户拍摄屏幕截图时不再称呼它。
这将有效地完全打破Snapchat,因此在新解决方案中添加了几个beta。现在,解决方案就像使用NSNotificationCenter向UIApplicationUserDidTakeScreenshotNotification添加观察者一样简单。
这是一个例子:
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
}
touchesCancelled:withEvent:
应该可以检测所有(最新)iOS版本的屏幕截图。
以下是在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")
}
斯威夫特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的任何要点...
似乎没有直接的方法可以检测用户是否点击了home + power button
。按照这种方式,可以通过使用darwin通知来实现此功能,但是它不再起作用。由于gmail已经在做,所以我猜测他们正在检查iPhone相册以检测在这10秒钟之间是否添加了新图片,并且某种程度上,他们正在与显示的当前图像进行比较。可能需要对此图像进行一些图像处理。只是一个想法,可能您可以尝试扩展此功能以使其起作用。检查此以获取更多详细信息。
编辑:
看起来他们可能正在检测UITouch取消事件(屏幕捕获取消了触摸),并根据此博客向用户显示此错误消息:如何在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
}
Home + Lock
按钮时,操作系统会立即像没有手指触摸屏幕一样起作用。也许这种情况没有touchesEnded:withEvent
通常发生的(或类似的回调)发生,所以他们可以监视这种独特的事件模式吗?我可能完全走错了方向,但这是我目前唯一的理论。
迅捷4+
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in
//you can do anything you want here.
}
通过使用此观察者,您可以确定用户何时截屏,但不能阻止他。
Swift 4示例
#1使用闭包
NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: OperationQueue.main) { notification in
print("\(notification) that a screenshot was taken!")
}
Example#2 with选择器
NotificationCenter.default.addObserver(self,
selector: #selector(screenshotTaken),
name: .UIApplicationUserDidTakeScreenshot,
object: nil)
@objc func screenshotTaken() {
print("Screenshot taken!")
}