Обнаружение скриншотов во всем приложении с одной страницы в ios

#ios #swift #screenshot

#iOS #swift #скриншот

Вопрос:

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

Мое приложение состоит из более чем 10 контроллеров, поэтому на каждой странице addobserver немного утомителен, поэтому мне нужно решение, если я могу разместить его в appdelegate / Scenedelegate или любом другом, чтобы на любом из снятых скриншотов контроллера я получал уведомления.Размещение — это главное, что требуется здесь

Что-то вроде достижимости, которая работает аналогичным образом для обнаружения сети

Вот код :

  func detectScreenShot(action: @escaping () -> ()) {
       UIScreen.main.addObserver(self, forKeyPath: "captured", options: .new, context: nil)
        
        let mainQueue = OperationQueue.main
        NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
            // executes after screenshot
            print(notification)
            action()
        }
    }



override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
        if (keyPath == "captured") {
            let isCaptured = UIScreen.main.isCaptured
          
            print(isCaptured)
        }
    }
  

Комментарии:

1. Обнаружение скриншотов отличается от захвата экрана и зеркального отображения. Вы можете подписаться на уведомление о скриншоте в любом удобном объекте hackingwithswift.com/example-code/uikit /…

2. @Paulw11 Я добавил того же наблюдателя, который указал в ссылке, а также в приведенном выше коде, но это я должен добавить во все контроллеры, которые мне не нужны. Мне нужна логика, в которой я должен добавить ее один раз, и она будет работать во всем приложении

3. Как я уже сказал, вы можете добавить наблюдателя в любой объект, который вам нравится. Вы можете добавить его в делегат приложения, если хотите.

4. @Paulw11 но когда я добавляю в appdelegate, он не будет обнаруживать скриншот на других страницах. для каждой страницы я должен добавлять эти строки кода, но я не хочу, чтобы в одном месте была одна функция, которая обрабатывает обнаружение скриншотов из everycontroller, например, достижимость

5. Я не уверен, что вы имеете в виду? При появлении скриншота публикуется уведомление. Это уведомление будет доставлено на зарегистрированное вами закрытие. Вы можете просмотреть уведомление в своем делегате приложения или в любом удобном месте. Нет необходимости специально отслеживать уведомление в каждом контроллере представления.

Ответ №1:

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

Комментарии:

1. Не могли бы вы показать демонстрацию этого ?? потому что я не знаю, как этого добиться