在把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