Posted at

UnityのPBXProjectでXcode7プロジェクトに.tbdを追加する

More than 3 years have passed since last update.

Xcode7ではdylibファイルがtbdファイルに切り替わったことがあり、

Unityでもその対応が必要になりそうです。

実際UnityからXcodeをビルドすると

libiconv.2.dylibがミッシングになっています。

こちらビルドは正常に通るみたいですが、

気になるのでPostProcessBuildとPBXProjectを使って自動置き換えを試みました。

(のちのち他のtbdを追加することもありそうですし...)

ちょっとさわってわかったのですが、

そもそも現状のPBXProjectはdylibファイルの追加も対応してないみたいです。

AddFrameworkToProjectやAddFileToBuildだと、

ProjectのヒエラルキーにはでるけどBuild Phasesには表示されないなどへんな感じです。

PBXProjectはソースが公開されているため確認すると、たしかにFrameworkのことしか考慮されていないもよう。

とういうことで、tbdを含めてLibraryを扱う機能を追加してみました。

https://bitbucket.org/mikito/xcodeapi/branch/feature/tbd

改造版PBXProjectの導入方法はこちら

http://qiita.com/mikito/items/0a1f14c6d9d573c1ab27

以下のようなコードで修正や追加を実行します。


Editor/FixIconvPostprocessBuildPlayer.cs

using UnityEngine;

using System.Collections;
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class FixIconvPostprocessBuildPlayer
{
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
if (buildTarget != BuildTarget.iPhone) return;

string projPath = PBXProject.GetPBXProjectPath(path);

PBXProject proj = new PBXProject();
proj.ReadFromFile(projPath);

string target = proj.TargetGuidByName("Unity-iPhone");

proj.RemoveLibraryFromProject(target, "libiconv.2.dylib");
proj.AddLibraryToProject(target, "libiconv.2.tbd", false);

proj.WriteToFile(projPath);
}
}


Unityが公式に対応するまでは、

こんな感じでやってくしかなさそうです。