App Store上的应用Snapchat是一款应用,可让您分享带有自毁功能的图片。您只能查看X秒的照片。如果您在使用家用电源键组合显示图片时尝试截取屏幕截图,则会告诉发件人您尝试截取屏幕截图。
SDK的哪个部分可以让您检测到用户正在截取屏幕截图?我不知道这是可能的。
答案 0 :(得分:338)
从iOS 7开始,其他答案已不再适用。 Apple已经做到了这一点,因此当用户截取屏幕截图时,不再调用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: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: .main) { notification in
//executes after screenshot
}
答案 1 :(得分:22)
我找到了答案!!截屏会中断屏幕上的任何触摸。这就是为什么Snapchat需要持有才能看到图片。参考:http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
答案 2 :(得分:11)
继承人如何在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
免责声明:我的回购
答案 3 :(得分:4)
最新 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的任何要点......
答案 4 :(得分:1)
看起来没有直接的方法来检测用户是否已点击 home + power button
。根据{{3}},可以通过使用darwin通知来提前,但它不再起作用。由于Snapchat已经在做了,我的猜测是他们正在检查iPhone相册以检测是否在这10秒之间添加了新图片,并且在某种程度上他们正在与当前显示的图像进行比较。可能会进行一些图像处理以进行此比较。只是一个想法,可能你可以尝试扩展它以使其工作。检查this。
修改强>
看起来他们可能正在检测UITouch取消事件(屏幕截图取消触摸)并根据此博客向用户显示此错误消息:this for more details
在这种情况下,您可以使用– 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
}
答案 5 :(得分:0)
快速浏览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!")
}
答案 6 :(得分:0)
快速4 +
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in
//you can do anything you want here.
}
使用该观察者,您可以确定用户何时截屏,但不能阻止他。