Unreal Engine
iOS 要件
- ~v1.1.1
- v1.2.0~
- Xcode15.X
- GameGuard for Mobile for iOS SDK v1.10.1.3 以上
- Xcode15.4 以上
- Minimum OS 12.0 以上
- GameGuard for Mobile for iOS SDK v1.10.2.0 以上
Xcode 15.4 未満バージョンでの自身の Minimum OS バグが存在します。
該当の Minimum OS バグは Xcode 15.4 バージョンから解決されました。
Unreal Plugin 基本説明
この文書は、プラグイン方式を使用して Unreal Engine 4, 5 開発環境で既存の SDK 適用方式よりも簡単に適用する方法を提供するため に作成されました。
Unreal Plugin ダウンロードおよびインストール
Unreal Plugin をインストールし、Unreal Engine 4, 5 でプロジェクトを構成する方法は次のとおりです。
-
GameGuard マネージャーサーバーに接続して Download > Unreal Plugins を選択し、最新バージョンをダウンロードします。
-
ダウンロードされた
AppGuardUnrealPlugin.zipファイル内に /AppGuardSDK というフォルダがあり、該当の AppGuardSDK フォルダを Project/Plugins/ パス内にコピーします。 -
Project/Source/ProjectName/ パス内の
APPNAME.Build.csファイルを開き、以下のように"AppGuardSDK"を追加して Unreal プロジェクトに AppGuard SDK をインストールできます。
PublicDependencyModuleNames.AddRange(new string[]
{
"Core", "CoreUObject", "Engine", "InputCore", "AppGuardSDK"
});
GameGuard Config ファイルダウンロードおよび設定
-
GameGuard マネージャーサーバーに接続して Applying Security > ダウンロード > CHAPTER 2. nProtect GameGuard CONFIG ファイルダウンロード > CONFIG FILE DOWNLOAD を選択してダウンロードします。
-
ダウンロードされた Config ファイルを解凍すると、GameGuard Config ファイルは
appguard,appguard.crt,appguard.mf,appguard106000の4つのファイルで構成されています。 -
これらの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(); 関数を必ず呼び出す必要があります。この関数は アプリ実行時に最初に実行されるタイミング で呼び出す必要があります。
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();
};
#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 形式のデータで渡して使用できます。
#include "AppGuardSDKPlugin.h"
#include "AppGuardSDKBlueprintLibrary.h"
UAppGuardSDKBlueprintLibrary::SetUserId(TEXT("userID"));
サーバー認証適用(選択)
この内容はサーバー認証を使用する場合に必要な内容であり、サーバー認証を使用しない場合は該当しません。
サーバー認証用コールバック関数実装
サーバー認証関連のコールバックは Delegate にコールバック登録および GameGuard 初期化関数呼び出し 部分で作成した OnS2AuthCompleted() コールバックメソッドを通じてサーバー認証動作イベントが伝達されます。
以下のサンプルコードのようにサーバー認証状態結果を OnS2AuthCompleted() コールバックメソッドを通じて確認できます。
#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 を使用して次のメソッドを呼び出すことができます。
#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)
- ~v1.10.1.3
- v1.10.2.0~
このガイドは Privacy Manifests 適用のために GameGuard SDK v1.10.1.3 バージョン以上を使用する必要があります。
Unreal Plugin には AppGuardCore.framework という名前で配布される GameGuard SDK が含まれています。
AppGuardCore.framework は Unreal Project/Plugins/AppGuardSDK/Source/AppGuardSDK/Libs/IOS/ 内部に AppGuardCore.framework.zip ファイルとして配布されます。
AppGuardCore.framework は Do Not Embed でプロジェクトにリンクされビルドされます。
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.xcprivacy は GameGuard SDK をリンクした TARGETS の PrivacyInfo.xcprivacy に
AppGuardCore.framework の PrivacyInfo.xcprivacy 内容が含まれる必要があります。
PrivacyInfo.xcprivacy に AppGuardCore.framework 関連内容を明示するために以下のガイドを参考にして統合作業を行ってください。
-
Unreal Project 内 使用中の
PrivacyInfo.xcprivacyファイルが存在する場合- AppGuardCore.framework 内部の
PrivacyInfo.xcprivacyファイル内容と既存の使用中のPrivacyInfo.xcprivacyを比較して欠落部分を確認します。 - 欠落部分が見つかった場合、欠落部分を既に使用中の
PrivacyInfo.xcprivacyファイルに追加および統合してください。
- AppGuardCore.framework 内部の
-
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 に統合作業が必要 になることがあります。
このガイドは Privacy Manifests 適用のために GameGuard SDK v1.10.2.0 バージョン以上を使用する必要があります。
GameGuard SDK v1.10.2.0 バージョン以上は Apple の Privacy Manifest 要求に合わせてビルドされ配布されるため、別途の統合作業は必要ありません。
[Apple & Creating a static framework]
Apple の要求事項に合わせて GameGuard for iOS SDK v1.10.2.0 バージョン以上は static framework として製作され、AppGuardCore.xcframework という名前で配布されます。
Apple & Creating a static framework 参考リンク : Apple & Creating a static framework
Unreal Plugin には AppGuardCore.framework という名前で配布される GameGuard SDK が含まれています。
AppGuardCore.framework は Unreal Project/Plugins/AppGuardSDK/Source/AppGuardSDK/Libs/IOS/ 内部に AppGuardCore.framework.zip ファイルとして配布されます。
AppGuardCore.framework は Do Not Embed でプロジェクトにリンクされビルドされます。
UE5.2 以上でサポートする Modernized Xcode オプションを使用してビルドする場合
AppGuardCore.framework を Embed&Sign 設定でプロジェクトにリンクしビルドするには以下のようにコードを修正する必要があります:
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"),
"",
true //<- 追加 : Embed&Sign 設定
)
);
string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory,
Target.RelativeEnginePath);
AdditionalPropertiesForReceipt.Add("IOSPlugin",
Path.Combine(PluginPath, "AppGuardSDK_UPL_IOS.xml"));
}
GameGuard for iOS SDK v1.10.2.0 バージョン以上は Apple が要求した Privacy Manifest で明示された Required reason API 項目 のうち NSPrivacyAccessedAPICategoryUserDefaults 以外の API は使用していない点を参考にしてください。
ここまで適用を完了すると GameGuard SDK 適用が完了します。