iOS屏幕截图检测?

iOS屏幕截图检测?,ios,screenshot,Ios,Screenshot,app Store上的应用程序可以让你分享带有自毁功能的图片。您只能在X秒内查看图片。如果您试图在使用home power key组合键显示图片时拍摄屏幕截图,它将告诉发件人您试图拍摄屏幕截图 SDK的哪一部分允许您检测用户正在拍摄屏幕截图?我不知道这是可能的。看起来没有直接的方法来检测用户是否点击了主页+电源按钮。根据,早期使用darwin通知是可能的,但现在已经不起作用了。因为snapchat已经在做了,我猜他们正在检查iPhone相册,以检测在这10秒之间是否添加了新图片,并以某种方式与当

app Store上的应用程序可以让你分享带有自毁功能的图片。您只能在X秒内查看图片。如果您试图在使用home power key组合键显示图片时拍摄屏幕截图,它将告诉发件人您试图拍摄屏幕截图

SDK的哪一部分允许您检测用户正在拍摄屏幕截图?我不知道这是可能的。

看起来没有直接的方法来检测用户是否点击了
主页+电源按钮。根据,早期使用darwin通知是可能的,但现在已经不起作用了。因为snapchat已经在做了,我猜他们正在检查iPhone相册,以检测在这10秒之间是否添加了新图片,并以某种方式与当前显示的图像进行比较。可能是为了进行比较而进行了一些图像处理。只是一个想法,也许你可以试着扩展它,让它工作。检查

编辑:

看起来他们可能检测到UITouch取消事件(屏幕捕获取消触摸),并根据此博客向用户显示此错误消息:

在这种情况下,您可以使用
–touchscancelled: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
}

我找到了答案!!截图会中断屏幕上的任何触摸。这就是snapchat需要按住才能看到图片的原因。参考资料:

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

这将有效地完全破坏Snapchat,因此在新的解决方案中添加了两个Beta。现在,解决方案非常简单,只需使用NSNotificationCenter向中添加一个观察者

下面是一个例子:

目标C 敏捷的
以下是如何在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()
    }
}
这作为标准功能包含在:


免责声明:这是我的回购协议最新的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
    }

工作完全正常。我看不到主队列的任何点…

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

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

,看起来它用于调用-applicationidentinterbackground:在早些时候拍摄屏幕截图之前。现在还不确定,伙计们。另一个线程的答案是:检查这个,它说这是不可能的了。也许你可以尝试一下,让我们知道。还没有在互联网上看到这一点,但我认为如果你使用Xcode(从“组织者”窗口中的设备)截图,应用程序绝对不可能知道。它必须在查看接收到的Snapchat照片时监控摄像头滚动以查看添加的任何照片,并且通过Xcode拍摄屏幕截图完全绕过了这一点(无需越狱)。后续:测试了这一理论,并确认应用程序未检测到Xcode屏幕截图。然而,我意识到有趣的是,在iOS 6上,应用程序必须被明确授予访问照片的权限……然而,这个应用程序仍然检测屏幕截图,而不允许它访问照片!它必须使用另一种检测方法——我注意到,当使用Home+Sleep按钮方法时,活动照片也会从屏幕上删除。因此,应用程序可以可靠地监控这个屏幕截图过程,可能有一个手势识别器?您似乎在正确的位置建立了良好的连接,以获得关于这个问题的明确答案;)这与其说是一个明确的答案,不如说是一个有根据的猜测。不幸的是,我没有任何联系来得到这个问题的确切答案。如果他们没有使用任何私有API,这是我能想到的唯一方法。检测相册中添加的图像,并根据某些算法将该图像与屏幕中的当前图像进行比较。但是,鉴于他们可以在不请求访问设备照片和相机卷的情况下执行此操作…这一定是其他操作,不是吗?我的理论是,他们让你长按收到的照片信息来查看它,当你按下
Home+Lock
按钮时,操作系统会立即像没有手指触摸屏幕一样工作。可能这在没有正常情况下使用
touchesend:withEvent
(或类似的回调)的情况下发生,那么他们是否可以监视这种独特的事件模式?我可能完全走错了方向,但这是我目前唯一的理论。把一个手指放在屏幕上,不举起它,如果你能按另外两个按钮,试试看。我想它仍然在显示这一信息。因此,他们可能正在使用一些私有API,并以某种方式设法将其放入appstore。从iOS 7开始不再可能。使用此选项和
touchCancelled:withEvent:
应允许您在所有(最新)版本的iOS上检测屏幕截图。这并不能阻止截图。它只能让应用程序知道其中一个被拿走了。。来自UIApplication类参考:用户按下Home和Lock按钮拍摄屏幕截图时发布的UIApplicationUserDidTakeScreenShot通知。此通知不包含userInfo字典。此通知在截屏后发布。@badweasel更正。考虑到此通知遵循传统的可可命名约定,“Did”一词意味着它是在事实之后发布的。在这种情况下,没有“意愿”等价物,而且AFAIK也没有办法阻止用户使用公共API截图。我读错了
NotificationCenter.default.addObserver(self, 
                                       selector: #selector(screenshotTaken), 
                                       name: .UIApplicationUserDidTakeScreenshot, 
                                       object: nil)

@objc func screenshotTaken() {
    print("Screenshot taken!")
}
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in
           //you can do anything you want here. 
        }