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

在把Unity打包成IOS安装包时,经常需要自动化设置导出工程的各项配置。

在Unity 4.x时代,常用的工具是XUPorter,在Unity 5.x之后,Unity官方提供了另外一套工具,叫做xcodeapi,因为是官方维护的,所以在使用上可以更放心,所以推荐使用。

xcodeapi的工程链接在Unity的开源bitbucket上:https://bitbucket.org/Unity-Technologies/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);
    }
}

一个日本人写了一个包含更多示例用法的文件,在:

https://gist.github.com/sanukin39/997d8364d16c5c27dae75a3bc1f1f045

 

关于这个方法的属性,网上的有些例子上写的是PostProcessBuild,其实只是PostProcessBuildAttribute的简写,意义是一样的,不需要纠结。

 

如果要对不同的配置做修改,比如,单独修改Debug版本或者Release版本的配置项,那么就需要用BuildConfigByName先获取到指定的配置项,然后使用SetBuildPropertyForConfig设置对应的配置项,例如,单独修改debug版本的ENABLE_BITCODE设置:

string configGuid = project.BuildConfigByName("targetGuid", "Debug");

project.SetBuildPropertyForConfig(configGuid, "ENABLE_BITCODE", "NO");

 

另外,对于XUPorter的导出插件和native代码的功能,Unity 5之后可以直接把需要的文件放在Assets/Plugins/iOS目录下面,文件就会被自动导出到目标工程中,请参考Unity文档:https://docs.unity3d.com/Manual/PluginsForIOS.html

你可能感兴趣的:(Unity)