Запрет на создание скриншота на iOS Cordova
Я воспользовался помощью чата GPT и он смог дать мне решение для запрета снимать видео на приложении и когда приложение уходит в фоновый режим его затемнять, а когда возвращается на передний план - восстанавливать.
platforms/ios/AppName/AppDelegate.m
#import "AppDelegate.h"
#import "MainViewController.h"
@interface AppDelegate ()
// Заглушка для защиты содержимого
@property (strong, nonatomic) UIView *privacyScreen;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions
{
// Создание основного контроллера
self.viewController = [[MainViewController alloc] init];
// Создание окна приложения
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.viewController; // Устанавливаем корневой контроллер
[self.window makeKeyAndVisible]; // Делаем окно видимым и активным
// Настраиваем защиту от записи экрана для iOS 11+
if (@available(iOS 11.0, *)) {
// Создаем заглушку (черный слой)
self.privacyScreen = [[UIView alloc] initWithFrame:self.window.bounds];
self.privacyScreen.backgroundColor = [UIColor blackColor];
self.privacyScreen.hidden = YES; // По умолчанию скрыта
[self.window addSubview:self.privacyScreen];
// Слушаем изменения записи экрана
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleScreenCaptureChange)
name:UIScreenCapturedDidChangeNotification
object:nil];
// Проверяем начальное состояние
[self handleScreenCaptureChange];
}
// Слушаем события перехода в фон и возвращения в активное состояние
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillEnterForeground)
name:UIApplicationWillEnterForegroundNotification
object:nil];
return YES; // Успешная загрузка
}
// Обработка изменений записи экрана
- (void)handleScreenCaptureChange {
if (@available(iOS 11.0, *)) {
if ([UIScreen mainScreen].isCaptured) {
// Показываем заглушку, если запись экрана активна
self.privacyScreen.hidden = NO;
} else {
// Скрываем заглушку, если запись экрана отключена
self.privacyScreen.hidden = YES;
}
}
}
// Обработка ухода приложения в фон
- (void)applicationDidEnterBackground {
self.privacyScreen.hidden = NO; // Показываем заглушку
}
// Обработка возвращения приложения из фона
- (void)applicationWillEnterForeground {
if (@available(iOS 11.0, *)) {
// Обновляем состояние заглушки на основе записи экрана
[self handleScreenCaptureChange];
} else {
self.privacyScreen.hidden = YES; // Скрываем заглушку, если запись экрана недоступна
}
}
@end
Можно ли сделать такую же заглушку при попытке создания скриншота или запретить делать скриншот каким-либо другим способом.
Ответы (1 шт):
Автор решения: деза
→ Ссылка
Обьяснение:
1. Обработка фонового режима:
В методах applicationDidEnterBackground и applicationWillEnterForeground мы управляем состоянием заглушки (черного слоя), чтобы затемнить экран при уходе в фоновый режим и восстанавливать его при возвращении.
Также проверяем статус записи экрана через UIScreenCapturedDidChangeNotification.
2. Защита от записи экрана:
Когда запись экрана активирована (iOS 11 и выше), заглушка становится видимой.
Когда запись экрана отключена, заглушка скрывается.
GPT доделал:
#import "AppDelegate.h"
#import "MainViewController.h"
@interface AppDelegate ()
// Заглушка для защиты содержимого
@property (strong, nonatomic) UIView *privacyScreen;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions {
// Создание основного контроллера
self.viewController = [[MainViewController alloc] init];
// Создание окна приложения
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = self.viewController; // Устанавливаем корневой контроллер
[self.window makeKeyAndVisible]; // Делаем окно видимым и активным
// Настраиваем защиту от записи экрана для iOS 11+
if (@available(iOS 11.0, *)) {
// Создаем заглушку (черный слой)
self.privacyScreen = [[UIView alloc] initWithFrame:self.window.bounds];
self.privacyScreen.backgroundColor = [UIColor blackColor];
self.privacyScreen.hidden = YES; // По умолчанию скрыта
[self.window addSubview:self.privacyScreen];
// Слушаем изменения записи экрана
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleScreenCaptureChange)
name:UIScreenCapturedDidChangeNotification
object:nil];
// Проверяем начальное состояние
[self handleScreenCaptureChange];
}
// Слушаем события перехода в фон и возвращения в активное состояние
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillEnterForeground)
name:UIApplicationWillEnterForegroundNotification
object:nil];
return YES; // Успешная загрузка
}
// Обработка изменений записи экрана
- (void)handleScreenCaptureChange {
if (@available(iOS 11.0, *)) {
if ([UIScreen mainScreen].isCaptured) {
// Показываем заглушку, если запись экрана активна
self.privacyScreen.hidden = NO;
} else {
// Скрываем заглушку, если запись экрана отключена
self.privacyScreen.hidden = YES;
}
}
}
// Обработка ухода приложения в фон
- (void)applicationDidEnterBackground {
// Показываем заглушку, когда приложение уходит в фон
self.privacyScreen.hidden = NO;
}
// Обработка возвращения приложения из фона
- (void)applicationWillEnterForeground {
// Восстанавливаем отображение экрана, когда приложение возвращается на передний план
if (@available(iOS 11.0, *)) {
// Обновляем состояние заглушки на основе записи экрана
[self handleScreenCaptureChange];
} else {
self.privacyScreen.hidden = YES; // Скрываем заглушку, если запись экрана недоступна
}
}
@end