1. 程式人生 > >Unity的IOS匯出工程配置工具xcodeapi

Unity的IOS匯出工程配置工具xcodeapi

在把Unity打包成IOS安裝包是,經常需要自動化設定匯出工程的各項配置。

在Unity 4.x時代,有個常用的工具叫XUPorter,在Unity 5.x之後,Unity官方提供了另外一套工具,叫做xcodeapi,應為是官方維護的,所以在後期維護上可以更放心,所以推薦使用。

其實,這個工具的工作原理並不複雜,利用的是Unity工作的一個固定流程:Unity在匯出工程之後,會去繼續搜尋並執行被標記為[PostProcessBuildAttribute]的方法,而對於Unity匯出的IOS工程,所有的配置資訊都會被記錄在一個固定名稱的檔案裡面,其中一個是匯出工程目錄下的 Unity-iPhone.xcodeproj/project.pbxproj,是以json格式儲存的文字檔案,所有的Build Setting項都在這個檔案裡面;另外一個叫Info.plist,是個xml格式的檔案。所以,這個工具就是提供了json和xml檔案操作的能力,和幾個特定的介面,用於更改指定配置項的內容。

明確這一點之後,使用起來應該就可以更有數了。使用方法很簡單,只要把工程檔案下載下來,把裡面的xcode目錄放到你工程的某個Editor目錄下,然後在裡面新增一個標記為PostProcessBuildAttribute的方法,在這個方法裡面修改你的xcode工程配置就可以了,例如下面的類,也放在Editor目錄下,類名隨便取:

public class ProjectPostProcess
{
    [PostProcessBuildAttribute(1)]
    public static void OnPostProcessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
        // 只處理IOS工程, pathToBuildProject會傳入匯出的ios工程的根目錄
        if (buildTarget != BuildTarget.iOS)
            return;

        // 建立工程設定物件
        var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
        PBXProject project = new PBXProject();
        project.ReadFromFile(projectPath);
        string targetGuid = project.TargetGuidByName("Unity-iPhone");

        // 修改BITCODE設定的例子
        project.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");

        // 修改後的內容寫回到配置檔案
        File.WriteAllText(projectPath, project.WriteToString());

        // 修改Info.plist的示例
        var plistPath = Path.Combine(pathToBuiltProject, "Info.plist");
        var plist = new PlistDocument();
        plist.ReadFromFile(plistPath);

        // 增加字串型別的設定
        plist.root.SetString("fieldname", "value");
    
        // 修改後的內容寫回到檔案Info.plist
        plist.WriteToFile(plistPath);
    }
}

一個日本人寫了一個包含更多示例用法的檔案,在:

關於這個方法的屬性,網上的有些例子上寫的是PostProcessBuild,其實只是PostProcessBuildAttribute的簡寫,意義是一樣的,不需要糾結。

不過這個工具相比XUPorter,沒有提供針對某類build型別的修改,比如,希望對debug和release版本的工程設定不同的配置,xcodeapi就做不了。不過,好像也不需要這樣配置,一次匯出很少有需求要同時輸出debug和release版本。如果有理解錯誤的地方,歡迎指正。