UnityのPBXProjectを今更少しだけ触ってみたのでメモ((φ(･д･｡)

既存のpythonに手を加えないで実装をしたかったので、PBXプロジェクトを試してみることに

[PBXProject](http://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html)
日本語のAPIリファレンスでは見つからないという罠。
試行錯誤なので、正しい実装かどうかもわからないのですが、とりあえず実装してみた。

#実装したい内容
XcodeプロジェクトのBuild Phase > Copy Bundle Resourcesにファイルを追加したい。
#実装
##PBXProjectの機能

- Unityから出力した Unity-iPhone.xcodeproj内のproject.pbxproj内を修正して変更を行う。
- ファイルや設定のほとんどはGUIDで管理されているので、ファイルのGUIDを取得してきてそれを使用して処理する。

##PBXProjectを取得
下記でプロジェクトを取得。
Unityのデフォルトなら、プロジェクト名とかも特に変更ないはず。
python等でプロジェクト名変更も考慮して、PostProcessBuildｍの値は小さめに設定。

```cs:Sample.cs
using UnityEngine;          // Assetsのパス取得とかDebug用
using UnityEditor;          // BuildTargetとか用
using UnityEditor.Callbacks;// [PostProcessBuild(n)]用
using UnityEditor.iOS.Xcode;// PBXProject用
using System.IO;            // File

public class Sample {
	
	[PostProcessBuild(1)] // 実行順序 昇順で実行
	public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
		if( tgt == BuildTarget.iOS )
		{
			// PBXプロジェクトファイルのフルパス
			string xcodeProjPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
		
			// プロジェクトファイルの読み込み
			PBXProject proj = new PBXProject();
			string file = File.ReadAllText( xcodeProjPath );
			proj.ReadFromString( file );	
			/*
			 * proj.ReadFromFile( xcodeProjPath );
			 * これでいい気がする。
			 */

			// GUIDを取得
			string target = proj.TargetGuidByName( xcodeProj );

		}
}

```

ここで取得したguidを使用して、いろいろ設定を変更していきます。

##AssetsからXcodeにファイルをコピーしてGUIDを取得
Unityでプラグイン認定されなかったファイルがXcodeに転送されないという悲しい展開があったので、手動でコピーします。
コピーはUnityEditorで用意されているFileUtiliryを使用すると楽チン！
（なんで、UnityEditorなんだろ・・・）

```cs:Sample.cs
	public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
		if( tgt == BuildTarget.iOS )
		{
			・・・
			// ファイルコピー
			FileUtil.CopyFileOrDirectory( Application.dataPath + "/masterFile.mst", path + "/masterFile.mst" );
			// GUIDを取得 物理パス（絶対パス）、相対パスで指定
			string fileGuid = proj.AddFile( path + "/masterFile.mst", "/masterFile.mst", PBXSourceTree.Source  );
	
			・・・
		}
	}
```

##プロジェクトに反映
取得してGUIDをPBXProjectに反映して書き込みます。


```cs:Sample.cs
	public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
		if( tgt == BuildTarget.iOS )
		{
			・・・
			// PBXProjectに設定
			proj.AddFileToBuild( target, privateKeyP12Guid );
			// 設定したデータを書き出す
			proj.WriteToFile( xcodeProjPath );
		}
	}
```

これで設定完了です。

#まとめ
どうやってCopy Bundle Resourcesにデータを登録するの？？？とかいろいろ考えて時間がかかってしまっていたんですが、
XCode側がうまく設定してくれました。
指定して設定する関数が用意されてなかったので、本当に大変でした。。。

ただ、Unityリファレンスにしっかり書かれたらサンプルも増えて実装の幅が広がるのかなと思いました。


ちなみに、frameworkやコンフィグ周りの設定は下記のように書けば、簡単に設定可能です。

```cs:Sample.cs
	public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
		if( tgt == BuildTarget.iOS )
		{
			・・・
			proj.AddBuildProperty( target, ”ENABLE_BITCODE”, "YES" );
			proj.AddFrameworkToProject( target, "abc.framework", isWeak );
			・・・
			
		}
	}
```


#最後までわからなかったこと（今後試したい）
- PBXProjectの設定用の関数を外だししようをしたらエラーが鳴り止まず、無視してビルドしてみようとしたら、Unityが固まるという事態。どうやって外だしするんや・・・
（[PostProcessBuild(n)]内でしか動かない？）
- proj.AddFile( path1, path2, PBXSourceTree.Source  );のPBXSourceTreeの使い分け。
- 同じくproj.AddFile()のパス指定。参考にしたPBXProject内のソースでは、相対パス、相対パスだった。。。リファレンスは違ったけども。。。
- Copy Bundle Resourcesに勝手に設定される基準。勝手にやられるのは意味不明で気持ち悪い。
- tdbとかdylib系の設定をしてないから、設定方法しっかりしておきたい。

追記
[info.plistをいじる](https://gist.github.com/keijiro/975b8439d25d58bf62ce)