147

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

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

4

7 回答 7

365

从 iOS 7 开始,其他答案不再正确。苹果已经做到了,所以touchesCancelled:withEvent:当用户截屏时不再调用它。

这将有效地彻底破坏 Snapchat,因此在新解决方案中添加了几个测试版。现在,解决方案就像使用 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: UIApplication.userDidTakeScreenshotNotification,
    object: nil,
    queue: .main) { notification in
        //executes after screenshot
}
于 2013-08-10T03:55:00.540 回答
25

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

于 2013-01-02T10:37:59.577 回答
16

下面是如何在 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

免责声明:它是我的回购

于 2015-11-27T02:43:21.563 回答
5

斯威夫特 4+

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

通过使用此观察者,您可以了解用户何时截屏,但您无法阻止他。

于 2019-09-22T08:42:30.890 回答
3

最新的 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 的任何点...

于 2017-07-02T07:03:21.303 回答
1

看起来没有直接的方法可以检测用户是否点击了home + power button. 根据this,之前可以使用 darwin 通知,但它不再起作用。由于 snapchat 已经这样做了,我的猜测是他们正在检查 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
}
于 2012-11-21T00:49:48.473 回答
0

斯威夫特 4 个例子

Example #1 使用闭包

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

Example #2 带选择器

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

@objc func screenshotTaken() {
    print("Screenshot taken!")
}
于 2019-08-09T16:48:04.677 回答