Уведомление или обнаружение снимка экрана?

Есть ли уведомление или другой механизм получения информации о том, что пользователь делает снимок экрана с помощью кнопок дома/питания?

Я видел потоки о том, чтобы отключить снятие скриншотов, но это не то, что я ищу.

У меня есть клиент-фотограф, который обеспокоен тем, что его работы будут скопированы с помощью пользователей, снимающих скриншоты, и я подумал, что если бы была возможность поместить водяной знак через изображение до того, как снимок был снят, это развешило бы его страхи.

Ответ 1

Я сомневаюсь, что это когда-нибудь будет и по уважительной причине. Вы не должны убирать функции скриншотов от своих пользователей.

Ответ 2

Вот способ, который может работать, хотя он будет полностью противоречить правилам пользовательского интерфейса. Я уверен. Если вы вынудите пользователя перенести палец на экран для показа изображения, я не думаю, что они могут создавать скриншоты. Поскольку, как только вы нажимаете клавиши "home + lock", чтобы на самом деле сделать снимок экрана, экран, похоже, ведет себя так, как будто пальцы не касаются его. Попробуйте сделать снимок экрана, перемещаясь между главными экранами, чтобы понять, что я имею в виду.

Не идеальное решение любыми способами, но вы можете работать с ним в своем дизайне приложений, если вы действительно умны, не отвлекая слишком много от пользовательского опыта (сложная задача, хотя!). Тем не менее, я считаю, что это может позволить вам отображать иллюстрации/фотографии, не позволяя пользователям делать снимки экрана.

Ответ 3

Уведомление Darwin PictureWasTakenNotification будет отправлено, когда пользователь сделает снимок экрана. Тем не менее, это отправляется после того, как снимок сделан.

(Пока не будет снят снимок, никаких уведомлений не будет отправлено.)

Ответ 4

Так как iOS 7 существует UIApplicationUserDidTakeScreenshotNotification. Итак, что-то вроде этого должно обнаружить скриншоты:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidTakeScreenshot) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
}

- (void)userDidTakeScreenshot {
    // Screenshot taken, act accordingly.
}

Наконец, не забудьте удалить наблюдателя:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationUserDidTakeScreenshotNotification object:nil];
}

Ответ 5

Что действительно необходимо, это уведомление, которое отправляется до фактического захвата экрана. Метод делегата или некоторые другие способы предоставления приложениям возможности скриншотов в полете для перерисовки вашего контента до захвата.

И нет никого.

Ответ 6

Switft 4.2 Код пользователя, снятый скриншот и запись экрана.

// MARK: - view life cycle
override func viewDidLoad() {

    super.viewDidLoad()

    // for screen shot
    NotificationCenter.default.addObserver(self, selector: #selector(screenShotTaken(notification:)), name: UIApplication.userDidTakeScreenshotNotification, object: nil)

     // for screen recording 
     if #available(iOS 11.0, *) {
        NotificationCenter.default.addObserver(self, selector: #selector(screenShotTaken(notification:)), name: UIScreen.capturedDidChangeNotification, object: nil)
    } else {
        // Fallback on earlier versions
    }

}

@objc func screenShotTaken(notification: Notification) {
    print(notification)
    print("Screenshot has taken, do something you want ")
}

Ответ 7

ПО ИСПОЛЬЗОВАНИЮ ДАННОГО ОТВЕТА ВЫ ПОЛУЧИТЕ УВЕДОМЛЕНИЕ ПОСЛЕ ПРИНЯТИЯ СКРИНШОТА.

iOS 11 и Swift 4

Три простых шага: -

1. Добавьте в свой ViewController или любое другое место, которое вы хотите,

NotificationCenter.default.addObserver(self, selector: #selector(screenShotTaken(notification:)), name: NSNotification.Name.UIApplicationUserDidTakeScreenshot, object: nil)

2. Будет вызван метод метода метода (ниже). Когда снимок будет сделан

@objc func screenShotTaken(notification: Notification) {
        print(notification)
        print("Screenshot has taken, do something you want ")
     }

3. Удалите своего наблюдателя (хороший способ удалить наблюдателя в deinit)

deinit {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationUserDidTakeScreenshot, object: nil)
    }