(这篇文章原来发布在 csdn ,现在 blog 迁移过来,并用 Markdown 重新排版以及修改)
因为项目的需求,最近学习了一下 project.pbxproj ,对于这个文件的介绍,网上有不少资料,但感觉都不甚详细,这里对我在学习中,学到的一些东西,稍作记录,一方面方便新学的同学能有个了解,同时也让自己以后,有个参考。
xcode 将我们对项目的配置信息,统一写到了 project.pbxproj 文件里,一般情况下,我们是不需要直接和 project.pbxproj 打交道的,我们通过编辑 xcode 里面的选项,如 buildsetting,general 来修改 pbxproj 文件,如下图所示:
但是,在一些情况下,我们为了方便、或者为了避免冲突,(尤其在多人协作的情况下),可能需要动态的修改 pbxproj 文件里面的内容,这个时候,我们就有必要了解一些project.pbxproj 文件的构成了。
pbxproj文件主要包含了以下几项主要信息
工程文件关联信息,如 PBXBuildFile、PBXFileReference
组织结构分类信息,如 PBXGroup
项目工程配置信息,如 XCBuildConfiguration、XCConfigurationList 这里主要介绍项目工程配置信息。
查看工程的 pbxproj 文件的方法:找到工程文件,也就是 yourproject.xcodeproj,右键,显示包内内容即可。
XCConfigurationList
这个部分,主要是 target ,以及 project 的一些基本信息,通常一个 project 会对应一个或者多个 target ,而每个 target 以及 project 本身的配置都会不同的,相应的,在 pbxproj 文件中,需要将这几个部分区分开来。如下图:
上图是一个 demo 工程里的 XCConfigurationList。这个工程有一个 project PBXProject "NSUrlSession" ,两个 target, 分别是
PBXNativeTarget "NSUrlSession" PBXNativeTarget "NSUrlSessionTests" 每个部分,都包含了 debug release 两部分,且都有相对应的 id。这些 uuid 是每个target 相应的 CONFIGURATION 配置下的唯一标识。
XCBuildConfiguration
这个部分,记录了 project 以及每个 target 具体的配置信息,以上面的例子为例,你想看知道 target NSUrlSession debug 对应的配置信息,你可以根据其相应的id(62A4BA691B8228C000568CEF),去找到其相应的配置:
buildsetting 下面保存了我们在 xcode 的 buildsetting 里面,对该 target 的 debug 所设置的所有信息。如果你想知道每个键值对具体对于那个选项,你可以在 buildsetting 对某一项进行更改,然后 diff 一下 pbxproj 文件即可。
在大致了解了pbxproj文件的结构后,你就可以开始做一些比较灵活的更改了,比如,我们在开发过程中,可能需要构建release、dailybuild等不同的ipa,每个ipa都包含不同的provisioning文件。针对某种情况,在构建过程总,手动选择不同的证书,显然太麻烦了,现在根据我们上面的知识,我们知道,我们使用xcode对项目进行配置,所有的配置结果最终都会保存到pbxproj文件里面,同样的,provisioning选项,也保存在其中。那么,我们在build之前,根据不同的CONFIGURATION,修改pbxproj文件中相应的provisioning文件,就能够达到修改provisioning配置的目的,自动的实现上述过程。
还以上面的例子来说,假如,我要在build之前,更改debug的provision,只需要把这个键值对改成自己希望的样子即可。
以下为实现的脚本
#replace
functhParam(){
orgin=$(grep -i -n $1 $filepath | head -n1 | awk -F ':''{print $1}')
count=$(grep -i -A 200 $1 $filepath | grep -i -n'PROVISIONING_PROFILE' | head -n 1 |awk -F ':''{print $1}')
let line=$orgin+count-1
echo $line
sed -i '' $line"s/^.*/$2/g" $filepath
}
#Debug
functhParam "^.*62A4BA691B8228C000568CEF.*="'PROVISIONING_PROFILE = "4173f94a-df88-4756-9f0e-1e40f83cdd21";'
这样,就在脚本中,将 debug 的provisioning 绑定为4173f94a-df88-4756-9f0e-1e40f83cdd21 了。