Запрет на создание скриншота на 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
→ Ссылка