Unity-iOS发布基本流程首先在Unity中导出Xcode工程,然后在Xcode工程中设置IOS打包的一些流程,诸如引入lib、framework或其他资源、设置签名及其他编译设置、加入编译脚本等等操作。
这些操作如果每次都是在导出Xcode后手动操作,一来浪费时间,二来容易出错。目前主要有以下方法自动化设置Xcode工程:
- Unity在导出Xcode工程时通过PostProcessBuild回调设置Xcode工程设置
- 另一种方法就是通过ruby库xcodeproj来设置,这种方法就脱离了Unity项目,就是一种专门设置xcode工程的方式。
自动设置好Xcode工程后我们就可以使用xcodebuild命令自动构建Xcode工程,使用ExportOptions.plist配置自动发布ipa或者正式包的流程。通过这么一整套流程下来就可以实现Xcode的整体自动化打包流程。本篇文章主要讲讲Xcode工程自动化配置的部分,后面如果觉得有必要再讲讲导出ipa的流程。
Xcode工程项目配置文件
在讲自动构建之前,我们先简单过一遍Xcode工程项目配置文件。如果你的Unity项目通过CocoaPods引入SDK,我们就需要打开*.xcworkspace,这个文件中包含了两个xcodeproj
- Unity-iPhone就是我们Unity导出的工程
- Pods就是我们使用pod install安装的pod工程
如果我们还有需要设置Pods工程设置的需求,比如说设置framework的签名或者其他的一些设置,使用Unity的回调就没办法实现了,pod安装是在unity导出xcode工程之后,只能在PodFile中生成Pod工程的时候设置或者使用xcodeproj这个ruby库统一设置。
*.xcodeproj中的*.pbxproj文件记录了所有我们的Xcode工程项目设置。你可以打开Unity-iPhone.xcodeproj下的project.pbxproj文件查看所有的工程项目设置。
pbxproj工程结构解析
Xcode读取rootObject值,获取project的uuid,从project开始解析整个项目配置。这个文件就很好理解,注释也很清晰,这个非常方便后期我们需要设置值时,只需要参照着做就行。
isa就相当于类型,我们可以方便的在xcodeproj中查询到修改的接口
实现自动设置的通用方法
确定修改什么地方
自动构建的前提是能够手动配置构建,这样做能很方便的理解我们需要在什么地方配置自动构建信息,比如说我想在Build Phase中添加一个shell script,可以先在Xcode中手动添加,然后通过git对比工具很方便的看到修改内容。
我们就可以很轻松的找到原来是PBXNativeTarget中buildPhases这个数组中添加了一个脚本对象。这种方法对于新手来说非常简单直接,药到病除
找到合适的工具(接口)来实现功能
使用xcodeproj
require "xcodeproj"
# @添加shell脚本
# 打开项目
project_path = "Unity-iPhone.xcodeproj"
# PBXProject
project = Xcodeproj::Project.open(project_path)
#@PBXNativeTarget
$pbx_native_target = project.targets[0]
build_phases = $pbx_native_target.build_phases
# 生成一个uuid
uuid = project.generate_uuid
puts "uuid===>" + uuid
# 设置脚本属性
script = Xcodeproj::Project::Object::PBXShellScriptBuildPhase.new(project,uuid)
script.name = "test shell"
script.shell_path = "/bin/sh"
script.shell_script = "ruby test.rb"
script.run_only_for_deployment_postprocessing = "0"
script.always_out_of_date = "1"
# 插入位置
build_phases.insert(3,script)
# 保存项目
project.save
我们通过注释可以知道ShellScript类型是PBXShellScriptBuildPhase,我们就可以通过创建一个这个对象来添加shellscript,其次里面的值都可以通过我们手动设置后去设置
使用unity回调方式设置
通过PBXProject->AddShellScriptBuildPhase来添加脚本,但是这种方式设置没有使用ruby设置的内容多。因此如果可能也更推荐使用xcodeproj库来配置工程。