【Unity】Unity4環境 & PBXProjectでiOSビルド時に自動でXcodeの設定をする【iOS】
chroske.hatenablog.com
前回の記事でUnity4じゃPBXProject使えないみたいなこと言ってしまいましたが
こちらの記事によると、どうやらUnity4でも出来るらしい...
Unity本家がPBXProjectだけ切り出して公開してくれてるみたいですね
なので前の記事でやったことをそのままUnity4環境&PBXProject使用でやってみたいと思います
やること
Unity4環境でありながらUnity5の機能であるPBXProjectを使ってiOSビルド時に自動で自前のフレームワークを追加したりファイルごとのARCの設定を行ったりする
準備
・https://bitbucket.org/Unity-Technologies/xcodeapi/downloadsからリポジトリをDLしてきてEditorフォルダに配置する
・DLしてきたフォルダ内にあるコードの「Utils.」を「PBX.Utils.」に置き換える(20個ぐらいある)
PBXProjectクラスを使ってファイル取り込みとパラメータ設定をする
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; using System.IO; public class AddMyFrameworkPostProcessBuild : MonoBehaviour { /* [PostProcessBuild]をつけるとビルド時に勝手に実行される */ [PostProcessBuild] public static void OnPostprocessBuild(BuildTarget buildTarget, string path) { if (buildTarget != BuildTarget.iPhone) return; string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj"; PBXProject proj = new PBXProject(); proj.ReadFromFile(projPath); string target = proj.TargetGuidByName("Unity-iPhone"); /* Xcodeに読み込ませるフォルダのpathからファイル一覧を再帰的に取得してaddする */ string[] path_array = Directory.GetFiles( path + "/Libraries/TestFramework" , "*.*", SearchOption.AllDirectories); foreach (string foler_path in path_array) { string after_path = foler_path.Replace(path+"/", ""); string guid = proj.AddFile (after_path, after_path, PBXSourceTree.Source); proj.AddFileToBuild(target, guid); } /* 読み込ませたファイルに-fobjc-arc(ARC有効フラグ)をセットする */ List<string> flags = new List<string>() {"-fobjc-arc"}; /* フラグセットするファイル一覧 */ List<string> setArcFiles = new List<string>(){ "TestFramework/TestFrameworkViewController.m", "TestFramework/TestFrameworkController.m", "TestFramework/TestFrameworkVerificationViewController.m", "TestFramework/TestFrameworkAgreementManager.m" }; /* SetCompileFlagsForFileを使ってフラグセット */ foreach (string fileName in setArcFiles) { string fileGuid = proj.FindFileGuidByProjectPath("Libraries/"+fileName); if (fileGuid == null) { Debug.LogError("Cannot find " + "Libraries/"+fileName); } proj.SetCompileFlagsForFile(target, fileGuid, flags); } proj.WriteToFile(projPath); } }
フォルダをXcodeのGroupとして取り込むAPIが用意されていなかったので、Directory.GetFilesでフォルダ内ファイルをすべて取得してループで一個ずつaddしております
mod-pbxprojにはあったのに...超めんどくさい...
これをしないと追加したファイルをXcodeがCompile Sourcesとして認識してくれないんですよね
原因見つけて解決するのに結構時間かかってしまった