iOS обнаружение скриншота?
приложение Snapchat, в App Store, это приложение, которое позволяет обмениваться фотографиями с самоуничтожением на них. Вы можете просматривать фотографии только в течение X секунд. Если вы попытаетесь сделать снимок экрана во время отображения изображения с помощью комбинации клавиш home-power, он сообщит отправителю, что вы пытались сделать снимок экрана.
какая часть SDK позволяет обнаружить, что пользователь делает снимок экрана? Я не знал, что это возможно.
5 ответов:
Я нашел ответ!! Съемка скриншота прерывает любые прикосновения, которые находятся на экране. Вот почему snapchat требует проведения, чтобы увидеть изображение. Ссылка: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
С 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 }];
Свифт
NotificationCenter.default.addObserver( forName: .UIApplicationUserDidTakeScreenshot, object: nil, queue: .main) { notification in //executes after screenshot }
вот как это сделать в 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") }
это включено в качестве стандартной функции в:
https://github.com/goktugyil/EZSwiftExtensions
отказ от ответственности: это мой РЕПО
последний 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...
похоже, что нет прямого способа сделать это, чтобы обнаружить, если пользователь нажал наhome + power button
. Согласно этой, это было возможно ранее с помощью уведомления Дарвина, но он больше не работает. Поскольку 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 }