メインコンテンツまでスキップ
バージョン: 1.10.x

Unreal Engine

iOS 要件


  • Xcode15.X
  • GameGuard for Mobile for iOS SDK v1.10.1.3 以上

Unreal Plugin 基本説明


この文書は、プラグイン方式を使用して Unreal Engine 4, 5 開発環境で既存の SDK 適用方式よりも簡単に適用する方法を提供するために作成されました。

Unreal Plugin ダウンロードおよびインストール

Unreal Plugin をインストールし、Unreal Engine 4, 5 でプロジェクトを構成する方法は次のとおりです。

  1. GameGuard マネージャーサーバーに接続して Download > Unreal Plugins を選択し、最新バージョンをダウンロードします。

  2. ダウンロードされた AppGuardUnrealPlugin.zip ファイル内に /AppGuardSDK というフォルダがあり、該当の AppGuardSDK フォルダを Project/Plugins/ パス内にコピーします。

  3. Project/Source/ProjectName/ パス内の APPNAME.Build.cs ファイルを開き、以下のように "AppGuardSDK" を追加して Unreal プロジェクトに AppGuard SDK をインストールできます。

APPNAME.Build.cs
PublicDependencyModuleNames.AddRange(new string[] 
{
"Core", "CoreUObject", "Engine", "InputCore", "AppGuardSDK"
});

GameGuard Config ファイルダウンロードおよび設定

  1. GameGuard マネージャーサーバーに接続して Applying Security > ダウンロード > CHAPTER 2. nProtect GameGuard CONFIG ファイルダウンロード > CONFIG FILE DOWNLOAD を選択してダウンロードします。

  2. ダウンロードされた Config ファイルを解凍すると、GameGuard Config ファイルは appguard, appguard.crt, appguard.mf, appguard106000 の4つのファイルで構成されています。

  3. これらの4つのファイルを以下のパスにコピーします:
    Copy To: Project/Binaries/IOS/Payload/APPNAME.app/

備考

UE5.2 以上でサポートする Modernized Xcode オプションを使用してビルドする場合
GameGuard Config ファイルは Unreal Project/XXXXProject/Binaries/IOS/XXXXX.app/ 内部にコピーする必要があります。

注意

Unreal Editor でまだ iOS ビルドを実行したことがない場合、Project/Binaries/IOS フォルダが存在しない可能性があります。このような場合は、iOS ビルドを一度実行した後、上記の作業を行ってください。

AppGuardSDK Unreal Plugin 適用


Delegate にコールバック登録および GameGuard for Mobile初期化関数呼び出し

アプリ実行時にセキュリティポリシー違反が検出された場合、コールバックを通じてイベントを受け取るには Delegate にコールバックを登録する必要があります。また、GameGuard 初期化作業のために UAppGuardSDKBlueprintLibrary::Start(); 関数を必ず呼び出す必要があります。この関数は アプリ実行時に最初に実行されるタイミング で呼び出す必要があります。

ASampleProjectGameMode.h
class ASampleProjectGameMode : public AGameModeBase
{
GENERATED_BODY()

//. 追加
virtual void InitGame(const FString& MapName,
const FString& Options,
FString& ErrorMessage) override;

void OnS2AuthCompleted(int value, const FString& data);
void OnDetected(int value);
//. 追加

public:
ASampleProjectGameMode();
};
ASampleProjectGameMode.cpp
#include "AppGuardSDKPlugin.h"
#include "AppGuardSDKBlueprintLibrary.h"

void ASampleProjectGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) {
//. セキュリティ検出用コールバック関数登録
FAppGuardSDKModule::OnDetected.AddUObject(this, &ASampleProject::OnDetected); // コールバック登録

//. サーバー認証用コールバック関数登録
FAppGuardSDKModule::OnS2AuthCompleted.AddUObject(this, &ASampleProject::OnS2AuthCompleted);

//. AppGuardCore.framework 使用のための GameGuard 初期化
UAppGuardSDKBlueprintLibrary::Start();
}

/* セキュリティ検出用コールバック関数サンプル */
void ASampleProjectGameMode::OnDetected (int data) {
bool killed = data > 0;
int code = data > 0 ? data : data * -1;

/*
Data の値が正の場合、GameGuard は 30 秒後に終了処理されます。
以下のサンプルコードを利用してユーザーに表示される画面に出力するようにしてください。
*/
if (killed) {
//. 終了通知ウィンドウを表示してゲームが終了することをユーザーに知らせます。
//. 終了通知ウィンドウは確認ボタンをクリックするとアプリが終了するように構成する必要があります。
}
}

/* サーバー認証用コールバック関数サンプル */
void ASampleProjectGameMode::OnS2AuthCompleted (int value, FString data) {
//. サーバー認証用コールバック関数の実装部分は [サーバー認証適用] 段階を参照してください。
}
注意

サービスリリース時には上記の セキュリティ検出用コールバック関数とサーバー認証用コールバック関数内のログ出力関数を必ず削除 してください。

UserID 設定

ポリシー違反検出時にログサーバーに User ID を送信するための SetUserId() メソッドを提供します。

以下のサンプルコードのように userID 部分に該当セッションのユーザー ID を FString 形式のデータで渡して使用できます。

ASampleProjectGameMode.cpp
#include "AppGuardSDKPlugin.h"
#include "AppGuardSDKBlueprintLibrary.h"

UAppGuardSDKBlueprintLibrary::SetUserId(TEXT("userID"));

サーバー認証適用(選択)


この内容はサーバー認証を使用する場合に必要な内容であり、サーバー認証を使用しない場合は該当しません。

サーバー認証用コールバック関数実装

サーバー認証関連のコールバックは Delegate にコールバック登録および GameGuard 初期化関数呼び出し 部分で作成した OnS2AuthCompleted() コールバックメソッドを通じてサーバー認証動作イベントが伝達されます。

以下のサンプルコードのようにサーバー認証状態結果を OnS2AuthCompleted() コールバックメソッドを通じて確認できます。

ASampleProjectGameMode.cpp
#include "AppGuardSDKPlugin.h"
#include "AppGuardSDKBlueprintLibrary.h"

// サーバー認証用コールバック関数サンプル
void ASampleProjectGameMode::OnS2AuthCompleted (int value, FString data)
{
switch (value)
{
case AppGuardEventType::S2Auth::S2AUTH_RESULT_SUCCESS:
/*
サーバー認証が成功し、正常に認証が完了しました。
*/
break;
case AppGuardEventType::S2Auth::S2AUTH_RESULT_RETRY:
/*
サーバー認証が失敗し、再認証を試みます。一時的なクライアントネットワーク障害またはサーバー障害である可能性があり、
該当の再試行は内部メカニズムに従って最大3分間実行されることがあります。
*/
break;
case AppGuardEventType::S2Auth::S2AUTH_RESULT_FAIL:
/*
サーバー認証が完全に失敗し、これ以上サーバー認証を試みません。
*/
break;
}
}
ヒント

以下の サーバー認証開始 説明のように UAppGuardSDKBlueprintLibrary::SetUniqueClientId() メソッドを呼び出すと その時点から GameGuard セキュリティモジュールがサーバー認証を試み、上記のサンプルコードに示されたように3つの状態コードをコールバックメソッドで伝達します。

注意

サービスリリース時には上記の サーバー認証用コールバック関数内のログ出力関数を必ず削除 してください。

サーバー認証開始

クライアントでサーバー認証を開始するには、以下のサンプルコードのようにサーバーから受信したユーザーのセッションに対する UniqueClientID を使用して次のメソッドを呼び出すことができます。

ASampleProjectGameMode.cpp
#include "AppGuardSDKPlugin.h"
#include "AppGuardSDKBlueprintLibrary.h"

UAppGuardSDKBlueprintLibrary::SetUniqueClientId(TEXT("Formatted-Unique-Client-Id", 180));
ヒント

この関数の最初の引数として与えられた Formatted-Unique-Client-Id の規則および生成方法は [主要 API] を参照してください。

GameGuard SDK Privacy Manifests 適用(UE4, UE5)

このガイドは Privacy Manifests 適用のために GameGuard SDK v1.10.1.3 バージョン以上を使用する必要があります。

ヒント

Unreal Plugin には AppGuardCore.framework という名前で配布される GameGuard SDK が含まれています。
AppGuardCore.frameworkUnreal Project/Plugins/AppGuardSDK/Source/AppGuardSDK/Libs/IOS/ 内部に AppGuardCore.framework.zip ファイルとして配布されます。

AppGuardCore.frameworkDo Not Embed でプロジェクトにリンクされビルドされます。

AppGuardSDK.Build.cs
if(Target.Platform == UnrealTargetPlatform.IOS)
{
string LibPath = Path.Combine(ModuleDirectory, "Libs/IOS");

PrivateIncludePaths.Add("AppGuardSDK/Private/IOS");
PublicFrameworks.Add("Security");
PublicAdditionalFrameworks.Add(
new Framework(
"AppGuardCore",
Path.Combine(LibPath, "AppGuardCore.framework.zip"),
""
)
);
string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory,
Target.RelativeEnginePath);
AdditionalPropertiesForReceipt.Add("IOSPlugin",
Path.Combine(PluginPath, "AppGuardSDK_UPL_IOS.xml"));
}

AppGuardCore.framework のモジュールは AppGuardCore.framework をリンクする TARGETS に統合され配布されます。

Apple Privacy Manifests に関連する PrivacyInfo.xcprivacyGameGuard SDK をリンクした TARGETS の PrivacyInfo.xcprivacy に AppGuardCore.framework の PrivacyInfo.xcprivacy 内容が含まれる必要があります。

PrivacyInfo.xcprivacy に AppGuardCore.framework 関連内容を明示するために以下のガイドを参考にして統合作業を行ってください。

  • Unreal Project 内 使用中の PrivacyInfo.xcprivacy ファイルが存在する場合

    • AppGuardCore.framework 内部の PrivacyInfo.xcprivacy ファイル内容と既存の使用中の PrivacyInfo.xcprivacy を比較して欠落部分を確認します。
    • 欠落部分が見つかった場合、欠落部分を既に使用中の PrivacyInfo.xcprivacy ファイルに追加および統合してください。
  • Unreal Project 内 PrivacyInfo.xcprivacy ファイルが存在しない場合

    • 以下の内容をコピーして PrivacyInfo.xcprivacy ファイルを生成します。
      以下の内容は UE5.4 で生成した PrivacyInfo.xcprivacy ファイルと AppGuardCore.framework の PrivacyInfo.xcprivacy ファイルを統合した内容です。 参考にして統合を進めてください。

      UE5.4 で生成した PrivacyInfo.xcprivacy ファイルに AppGuardCore.framework の PrivacyInfo.xcprivacy ファイルを統合した内容を見る
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>NSPrivacyCollectedDataTypes</key>
      <array>
      <dict>
      <key>NSPrivacyCollectedDataType</key>
      <string>NSPrivacyCollectedDataTypeCrashData</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <false/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <array>
      <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyCollectedDataType</key>
      <string>NSPrivacyCollectedDataTypeGameplayContent</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <true/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <array>
      <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyCollectedDataType</key>
      <string>NSPrivacyCollectedDataTypeProductInteraction</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <false/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <array>
      <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyCollectedDataType</key>
      <string>NSPrivacyCollectedDataTypeUserID</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <true/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <array>
      <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyCollectedDataType</key>
      <string>NSPrivacyCollectedDataTypeDeviceID</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <true/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <array>
      <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyCollectedDataType</key>
      <string>NSPrivacyCollectedDataTypeOtherDataTypes</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <true/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <array>
      <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      </array>
      </dict>
      </array>
      <key>NSPrivacyTracking</key>
      <false/>
      <key>NSPrivacyAccessedAPITypes</key>
      <array>
      <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array>
      <string>C617.1</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array>
      <string>E174.1</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array>
      <string>35F9.1</string>
      </array>
      </dict>
      <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array>
      <string>CA92.1</string>
      </array>
      </dict>
      </array>
      </dict>
      </plist>
    • 生成した PrivacyInfo.xcprivacy ファイルを UnrealProjects/XXXXProject/Binaries/IOS/Payload/XXXXX.app/ 内部にコピーして追加してください。

ヒント

UE5.2 以上でサポートする Modernized Xcode オプションを使用してビルドする場合
PrivacyInfo.xcprivacy のコピー位置は Unreal Project/XXXXProject/Binaries/IOS/XXXXX.app/ 内部にコピーする必要があります。

GameGuard for iOS SDK v1.10.1.3 バージョン以上AppGuardCore.framework という名前で配布され、 該当 SDK は static framework として製作され配布されます。

GameGuard for iOS SDK v1.10.1.3 バージョン以上は Apple が要求した Privacy Manifest で明示された Required reason API 項目 のうち NSPrivacyAccessedAPICategoryUserDefaults 以外の API は使用していない点を参考にしてください。

static framework としてリンクされる他社 SDK の場合 GameGuard SDK と同様に 顧客の PrivacyInfo.xcprivacy に統合作業が必要 になることがあります。