Unity×iOS

【Unity×iOS】スクリーン録画を検知する方法|ReplayKit含む実装ガイド

iOSでは、ユーザーが画面録画を開始した際にアプリ側で検知することが可能です。
特に著作権保護コンテンツや、チート・不正利用の監視が必要なアプリでは、スクリーン録画の検出は重要なセキュリティ機能となります。
この記事では、UnityからiOSのスクリーン録画をリアルタイムに検知する方法を、ReplayKit対応も含めてコピペOKで解説します!

この記事で分かること

  • iOSでスクリーン録画を検知する基本的な仕組み
  • UIScreen.isCapturedを使った録画チェック
  • 【コピペOK】Objective-C++プラグイン+Unity C#スクリプト
  • 録画検出を活かした対策アイデア(UI表示、機能制限など)

スクリーン録画検出の仕組み(iOS標準)

iOS11以降、システムはUIScreen.mainScreen.isCapturedプロパティで、
画面が録画・ミラーリングされているかをリアルタイムに提供しています。

これに加えて、録画開始・停止時の通知も用意されています:

NSNotification.Name.UIScreenCapturedDidChangeNotification

これらを活用すれば、ReplayKitやコントロールセンター経由の録画をアプリ側で検知可能です。

【コピペOK】録画検知用ネイティブプラグイン作成

.mmファイルを作成する

Assets/Plugins/iOS/ScreenRecordingDetector.mmを作成しましょう。

#import <UIKit/UIKit.h>

static void (*recordingCallback)(bool) = NULL;

extern "C" {

bool IsScreenBeingRecorded()
{
    return UIScreen.mainScreen.isCaptured;
}

void SetScreenRecordingCallback(void (*callback)(bool))
{
    recordingCallback = callback;

    [[NSNotificationCenter defaultCenter] addObserverForName:UIScreenCapturedDidChangeNotification
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification *note) {
        if (recordingCallback)
        {
            recordingCallback(UIScreen.mainScreen.isCaptured);
        }
    }];
}
}

Unity側のC#スクリプトを書く

using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class ScreenRecordingDetector : MonoBehaviour
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern bool IsScreenBeingRecorded();

    [DllImport("__Internal")]
    private static extern void SetScreenRecordingCallback(ScreenRecordingCallbackDelegate callback);

    private delegate void ScreenRecordingCallbackDelegate(bool isRecording);
#else
    private static bool IsScreenBeingRecorded() => false;
    private static void SetScreenRecordingCallback(ScreenRecordingCallbackDelegate callback) { }
    private delegate void ScreenRecordingCallbackDelegate(bool isRecording);
#endif

    public static event Action<bool> OnRecordingChanged;

    [AOT.MonoPInvokeCallback(typeof(ScreenRecordingCallbackDelegate))]
    private static void OnRecordingChange(bool isRecording)
    {
        OnRecordingChanged?.Invoke(isRecording);
        Debug.Log($"録画状態が変化しました: {(isRecording ? "録画中" : "停止中")}");
    }

    void Start()
    {
        SetScreenRecordingCallback(OnRecordingChange);

        if (IsScreenBeingRecorded())
        {
            Debug.Log("アプリ起動時点で録画が有効です");
            OnRecordingChanged?.Invoke(true);
        }
    }
}

使用例:録画中に警告UIを表示する

録画中に警告を出したり、機能制限することで情報保護・不正防止が可能になります。

public class RecordingWarning : MonoBehaviour
{
    public GameObject warningPanel;

    void OnEnable()
    {
        ScreenRecordingDetector.OnRecordingChanged += HandleRecordingChange;
    }

    void OnDisable()
    {
        ScreenRecordingDetector.OnRecordingChanged -= HandleRecordingChange;
    }

    private void HandleRecordingChange(bool isRecording)
    {
        warningPanel.SetActive(isRecording);
    }
}

注意点・補足

  • isCaptured == trueになるのは録画だけでなくAirPlayや外部ミラーリング中も含まれる
  • iOSの仕様により、録画検出が100%のセキュリティではないが、実用レベルでは十分
  • Androidでは仕組みが異なるため別途実装が必要

まとめ

項目内容
iOSの画面録画はUIScreen.isCapturedで検知可能
通知(UIScreenCapturedDidChange)でリアルタイム対応も可能
Unityからの録画検知はプラグイン連携が必要
セキュリティや不正対策に活用できる

ユーザーの操作を検知して、適切なフィードバックや保護処理を導入できるこの仕組み、
ぜひあなたのUnity×iOSアプリでも取り入れてみてください!