iOS録画画面とスクリーンモニターモニターの実現コード


最近はプロジェクトの安全性に関する仕事をしています。APP内の敏感ページでユーザーのスクリーンショット防止の機能をする必要があります。
スクリーン状態取得
アルバムの最新写真を編集する方法はiOS 8以降では無効となり、フレームワークの「Photos」もiOS 10以降では無効となります。
検索でUAppplicationの中にはユーザーがスクリーンショットした後の通知しかないです。アプリケーションではスクリーンショットした通知しか受けられません。介入できません。

// This notification is posted after the user takes a screenshot (for example by pressing both the home and lock screen buttons)
UIKIT_EXTERN NSNotificationName const UIApplicationUserDidTakeScreenshotNotification NS_AVAILABLE_IOS(7_0);
直接介入はできませんが、ユーザがスクリーンを切ったら、他の方法でユーザの行動を制限したり、ポップアップヒントをユーザに伝えることができます。

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

-(void)screenshots
{
  UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:nil message:@"[    ]        。    ,                 。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"  ", nil];
  [alert1 show];

-(void)dealloc
{
  [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationUserDidTakeScreenshotNotification object:nil];
}

ディスク状態取得
iOS 11 SDKには、現在の画面が録画されていることを知らせるために、UICreenのAPIが追加されている。UICScreen.isCapturedがtrueであるとき、現在のスクリーンが録画されているか、ミラーリングされているか、あるいはAirlayに送信されているかを示します。
録画画面の状態が変化すると、UIKEreenCapturedDidChangeのnotificationが送信されます。
これに基づいて、アプリケーションでこの通知を受信して、ユーザの記録画面の動作に対応する処理を行うことができます。

-(void)viewWillAppear:(BOOL)animated{
  [super viewWillAppear:animated];

//              
  UIScreen * sc = [UIScreen mainScreen];
  if (@available(iOS 11.0, *)) {
    if (sc.isCaptured) {
      NSLog(@"    ~~~~~~~~~%d",sc.isCaptured);
      [self screenshots];
    }
  } else {
    // Fallback on earlier versions
  }
  if (@available(iOS 11.0, *)) {
//               
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenshots) name:UIScreenCapturedDidChangeNotification object:nil];
  } else {
    // Fallback on earlier versions
  }
}

-(void) screenshots
{
  UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:nil message:@"[    ]        。    ,                 。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"  ", nil];
  [alert1 show];

-(void)dealloc
{
  if (@available(iOS 11.0, *)) {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil];
  } else {
    // Fallback on earlier versions
  }
}

上記の監視記録画面の状態はiOS 11の後だけで、しかも単に録画画面の状態を検出しただけで、録画した内容をオフにすることができませんでした。iOS 11の前の録画手段の監視はまだ確認されていません。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。