#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. Не могли бы вы показать демонстрацию этого ?? потому что я не знаю, как этого добиться