Unityを利用してiOSの開発をしていると、
ちょいちょい出力したXcodeプロジェクトに、Frameworkなどを追加する必要が出てきたりします。
毎回手動でやるのはめんどし、
Jenkinsなどと統合している場合は自動化しなければなりません。
ということで今まではPython製のmod-pbxprojやC#製でUnity用のXCodeEditor-for-Unityなど、外部のツールを利用して頑張るのが一般的でした。
しかしUnity5からPBXProjectというAPIがデフォルトでつかえます。
http://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html
このAPIとPostProcessBuildアトリビュートと組み合わせて以下みたいに書くと、簡単にFrameworkとか追加できます。
using UnityEngine;
using System.Collections;
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
public class AddFrameworkPostProcessBuild
{
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
if (buildTarget != BuildTarget.iOS) return;
string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
PBXProject proj = new PBXProject();
proj.ReadFromFile(projPath);
string target = proj.TargetGuidByName("Unity-iPhone");
proj.AddFrameworkToProject(target, "StoreKit.framework", false);
proj.WriteToFile(projPath);
}
}
FrameworkだけでなくOther Linker Flagの追加やファイルの追加などもできます。
すごく簡単!!
Unity4でつかう
しかし、PBXProjectはUnity5用です。
まだUnity4で運用しているプロジェクトがある中でそんなのずるい!
ということで、一応利用する方法はあります。
まず、Unity.appを右クリックしてメニューを表示し、
「パッケージの内容を表示」をクリックします。
そして、パスを辿り以下のファイルをUnityプロジェクトのEditorフォルダ以下にドラッグアンドドロップします。
/Applications/Unity4.6.9/Unity.app/Contents/PlaybackEngines/iossupport/UnityEditor.iOS.Extensions.Xcode
これで、PBXProjectの機能をUnity4でも使えるようになります。
じつはこのUnityEditor.iOS.Extensions.XcodeはUnity4.6あたりから、
含まれていたようです。
だたし、Unity5にバンドルされているバージョンとは少し異なるようで、
使えるAPIに差異があったりします。
Unity4/Unity5でPBXProjectの最新版・修正版を使う
さてPBXProjectは便利なのですが、
Unity4では最新版でなかったり、
バグがあったりdylibファイルの追加に対応していなかったりします。
そんな時は、PBXProjecリポジトリが
公式から公開されているため、それをインポートすることも可能です。
リポジトリ名はXcodeAPIになってます。
プロジェクトをダウンロード or Cloneしてきて、
Editor以下に配置すればOKです。
ただし、そのままだとUtils周りでエラーが出るため、
以下の修正が必要です。
Utils.*** => PBX.Utils.***
修正箇所が20箇所ぐらいありますが...なんとか置換でいけます。
また、かゆいところに手がとどかない...
みたいなところがあれば自分で機能を修正することも可能です。(自己責任ですが)
ちなみに、dylibの追加に対応していなかったので、
Forkして機能を追加し、Utilsの件も含めて修正してしまいました。
(こちらも利用するときは自己責任で)
https://bitbucket.org/mikito/xcodeapi/