project.pbxproj 文件的学习

浏览: 180 发布日期: 2016-08-17 分类: xcode

(这篇文章原来发布在 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 了。

返回顶部