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

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

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

Ответ 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. 
        }

с помощью этого наблюдателя вы можете узнать, когда пользователь делает снимок экрана, но вы не можете предотвратить его.