iOS обнаружение скриншота?


приложение Snapchat, в App Store, это приложение, которое позволяет обмениваться фотографиями с самоуничтожением на них. Вы можете просматривать фотографии только в течение X секунд. Если вы попытаетесь сделать снимок экрана во время отображения изображения с помощью комбинации клавиш home-power, он сообщит отправителю, что вы пытались сделать снимок экрана.

какая часть SDK позволяет обнаружить, что пользователь делает снимок экрана? Я не знал, что это возможно.

5 117

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
}