Unity で iOS アプリを開発していると、Xcode 側で毎回同じ設定を手動で変更するのがつらい…… という場面が必ず出てきます。
- Info.plist に権限説明を追加したい
- iOS Framework をリンクしたい
- Swift を使う際のビルド設定を整えたい
- ネイティブブリッジ用の .mm を自動で配置したい
しかし、これらを “ビルドのたびに Xcode で手作業” するのは非効率で、ミスも起きやすいです。
そこで役立つのが PostProcessBuild です。
この記事では、初心者でも理解できるように、概念を中心に PostProcessBuild の仕組みと代表的な用途をわかりやすく解説します。コード例は必要最低限に抑えています。
PostProcessBuildとは?
Unity のビルドが完了したあと、Xcode プロジェクトに対して自動処理を追加できる仕組みです。
代表的にできること:
- Info.plist の編集
- iOS Framework の追加
- Build Settings の変更
- ネイティブ (.mm / .swift) ファイルの登録
つまり、iOS ネイティブ周りの面倒な作業を Unity 側で一括自動化できるわけです。
実行順を決める [PostProcessBuild] の番号
[PostProcessBuild] は次のように書きます:
[PostProcessBuild]
この場合、実行順は自動的に 1000 として扱われます。
番号を指定すると順番が変えられます:
[PostProcessBuild(1500)]
よく使われる番号は「1500」
- Unity の内部処理は 1000 付近で実行される
- その後に自分の設定を上書きしたい
→ 1500 にしておくと “Unity 標準処理の後” に確実に反映される ため安全です。
番号は必須ではありませんが、iOS 設定を安定させたい場合は付けておくのがおすすめです。
基本的な構造
最小構成のコードは次のようになります。
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
public class IOSPostBuild
{
[PostProcessBuild(1500)]
public static void OnPostProcessBuild(BuildTarget target, string path)
{
var projPath = PBXProject.GetPBXProjectPath(path);
var proj = new PBXProject();
proj.ReadFromFile(projPath);
var targetGuid = proj.GetUnityMainTargetGuid();
// ここに設定を追加していく
proj.WriteToFile(projPath);
}
}
ここから目的に応じて処理を追加していきます。
代表的な用途①:Info.plist のキー追加
カメラ・マイクなどを使う場合、説明文を追加しないと審査リジェクトの原因になります。
例(マイク権限):
var plistPath = Path.Combine(path, "Info.plist");
var plist = new PlistDocument();
plist.ReadFromFile(plistPath);
var root = plist.root;
root.SetString("NSMicrophoneUsageDescription", "アプリで音声を利用します。");
plist.WriteToFile(plistPath);
よく使う権限:
- NSCameraUsageDescription
- NSMicrophoneUsageDescription
- NSPhotoLibraryUsageDescription
- NSUserTrackingUsageDescription(ATT)
代表的な用途②:iOS Framework の追加
特定の機能を使うためには framework をリンクする必要があります。
例:AppTrackingTransparency.framework
proj.AddFrameworkToProject(targetGuid, "AppTrackingTransparency.framework", false);
false は Optional(弱リンク) を意味します。
OS バージョン依存の framework を扱う際に安全です。
よく使うもの:
- UserNotifications.framework
- StoreKit.framework
- AdSupport.framework
代表的な用途③:ネイティブファイル (.mm / .swift) の登録
Unity → iOS ネイティブ連携を行う場合、Plugins/iOS に配置したファイルを Xcode プロジェクトへ登録する必要があります。
例:
var filePath = Path.Combine(path, "Libraries/Plugins/iOS/NativeBridge.mm");
proj.AddFile(filePath, "NativeBridge.mm");
Swift を使う場合の注意
Swift ファイルを追加した場合は、以下の Build Setting が必須:
- SWIFT_VERSION
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
忘れると ビルドは通ってもアプリ起動時にクラッシュ しがちです。
代表的な用途④:Build Settings の変更
例:Bitcode を OFF にする(近年では非推奨のため OFF が一般的)
proj.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");
Swift を使う場合:
proj.SetBuildProperty(targetGuid, "SWIFT_VERSION", "5.0");
proj.SetBuildProperty(targetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
ほかにも、以下のような設定を自動化できます:
- CLANG_ENABLE_MODULES
- DEBUG_INFORMATION_FORMAT
- iOS Deployment Target の変更
PostProcessBuild は「iOS設定のチェックリスト」を自動化するもの
PostProcessBuild を使うと、以下を毎回自動反映できます:
- 権限(plist)
- 必要な framework
- ネイティブブリッジの登録
- Swift 設定
- Build Settings の統一
手作業だとミスが起きやすい部分をすべてコード化できるため、ビルドの安定性が大幅に向上します。
まとめ
- PostProcessBuild は iOS ビルド後の設定を自動化できる仕組み
- 番号を付けることで Unity 標準処理より後に実行できる
- plist 編集・framework 追加・Build Settings 変更などによく使われる
- Swift 連携時は必須の設定があるため特に有効
Unityで iOS を扱うなら、早い段階で覚えておくと開発スピードが大きく変わります。
ブログでもUnityや個人開発ネタを発信中です!
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com
公開中のアプリ一覧はこちら!
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/
YouTubeショートでもゲーム開発の裏側を公開中!
Unityで制作中のゲームの進捗や演出テスト、実装の様子を
ショート動画でタイムラプス形式にまとめて発信しています。
▶ https://www.youtube.com/@syunpp_8413/shorts