iOS检测截图?

时间:2012-11-21 00:27:27

标签: ios screenshot

App Store上的应用Snapchat是一款应用,可让您分享带有自毁功能的图片。您只能查看X秒的照片。如果您在使用家用电源键组合显示图片时尝试截取屏幕截图,则会告诉发件人您尝试截取屏幕截图。

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

7 个答案:

答案 0 :(得分:338)

从iOS 7开始,其他答案已不再适用。 Apple已经做到了这一点,因此当用户截取屏幕截图时,不再调用touchesCancelled:withEvent:

这将完全打破Snapchat,因此增加了一个新解决方案中的几个beta。现在,解决方案就像使用NSNotificationCenter将观察者添加到UIApplicationUserDidTakeScreenshotNotification一样简单。

以下是一个例子:

目标C

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. 
        }

使用该观察者,您可以确定用户何时截屏,但不能阻止他。