Приложение Snapchat в App Store - это приложение, которое позволяет обмениваться фотографиями с их самоуничтожением. Вы можете просматривать только фотографии за X секунд. Если вы попытаетесь сделать снимок экрана, пока изображение будет показано с помощью комбинации клавиш домашнего питания, оно сообщит отправителю, что вы попытались сделать снимок экрана.
Какая часть SDK позволяет обнаружить, что пользователь делает снимок экрана? Я не знал, что это возможно.
Ответ 1
Я нашел ответ! Выполнение снимка экрана прерывает любые нажатия на экране. Вот почему snapchat требует удерживания, чтобы увидеть картинку. Ссылка: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
Ответ 2
Начиная с iOS 7 другие ответы больше не верны. Apple сделала это так, что touchesCancelled:withEvent:
больше не вызывается, когда пользователь делает снимок экрана.
Это фактически полностью разрушит Snapchat, поэтому была добавлена пара бета-версий в новом решении. Теперь решение так же просто, как использование NSNotificationCenter для добавления наблюдателя в UIApplicationUserDidTakeScreenshotNotification.
Вот пример:
Цель C
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
object:nil
queue:mainQueue
usingBlock:^(NSNotification *note) {
// executes after screenshot
}];
Swift
NotificationCenter.default.addObserver(
forName: UIApplication.userDidTakeScreenshotNotification,
object: nil,
queue: .main) { notification in
//executes after screenshot
}
Ответ 3
Heres, как это сделать в 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
Отказ от ответственности: его репо
Ответ 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...
Ответ 5
Похоже, нет прямого способа сделать это, чтобы определить, нажал ли пользователь на home + power button
. В соответствии с этим, это было возможно раньше, используя уведомление darwin, но оно больше не работает. Поскольку snapchat уже делает это, я предполагаю, что они проверяют фотоальбом iPhone, чтобы определить, добавлено ли новое изображение между этими 10 секундами, и каким-то образом они сравниваются с текущим изображением. Возможно, для этого сравнения сделана некоторая обработка изображений. Просто мысль, возможно, вы можете попытаться расширить ее, чтобы она работала. для более подробной информации.
Edit:
Похоже, что они могут обнаружить событие отмены 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
}
Ответ 6
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!")
}
Ответ 7
Свифт 4+
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in
//you can do anything you want here.
}
с помощью этого наблюдателя вы можете узнать, когда пользователь делает снимок экрана, но вы не можете предотвратить его.