代官山らへんで働くengineerのUnityブログ

サーバサイドやってきたエンジニアがUnityとか触って遊ぶだけのブログ

【Unity】Unity4環境 & PBXProjectでiOSビルド時に自動でXcodeの設定をする【iOS】

chroske.hatenablog.com
前回の記事でUnity4じゃPBXProject使えないみたいなこと言ってしまいましたが


qiita.com

こちらの記事によると、どうやら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として認識してくれないんですよね

原因見つけて解決するのに結構時間かかってしまった