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アプリでも取り入れてみてください!