project.pbxproj,最熟悉的”陌生人”

By | 2015年5月11日
转载请注明出处:http://www.olinone.com/

作为iOS开发人员,pbxproj文件对于我们来说即熟悉又陌生,熟悉到我们每天都得见面。而除了偶尔遇到的合并冲突,其余时候我们甚至忘记了它的存在。当然,并不是说它不重要,相反,pbxproj文件保存了项目的所有配置关联信息

pbxproj文件主要包含了以下几项主要信息

  1. 工程文件关联信息,如PBXBuildFile、PBXFileReference
  2. 组织结构分类信息,如PBXGroup
  3. 项目工程配置信息,如XCBuildConfiguration、XCConfigurationList

pbxproj文件格式既不是json也不是xml,但是网上已经开源了不少解析该文件的工具,如XcodeProjectJavaAPIpbxplorer等,通过这些工具,我们可以解析pbxproj文件从而获取工程的一些配置信息等。

由于xcode工具的存在,我们一般不需要与pbxproj直接打交道,通过General、Build Settungs或者Info等面板,就可以完成项目工程配置信息的修改。但是,当涉及到命令行的时候,xcode就显得束手无策。最常见的比如ci的持续集成。通常情况下,大型工程一般由多个开发人员共同开发,而每一个开发人员的开发证书配置文件都有可能不同,特别是当工程中包含Today或者Watch时,配置证书的不同经常会导致ci编译的失败。此时,通过xcode几乎无法解决问题,而在ci编译前,通过修改pbxproj文件证书配置信息就能很好的解决该问题

打开pbxproj文件,涉及到证书配置文件的代码段如下

我们需要做的就是在ci编译前用服务器上相应mobileprovision替换PROVISIONING_PROFILE后面的mobileprovision(mobileprovision文件通常以字符串命名),不幸的是,你会发现多行PROVISIONING_PROFILE,而Today和Watch与工程的证书文件都不相同,简单的字符替换已无法区别target。解决方法就是通过A05D02521AFFB09600011ADB这一串编号(姑且叫它编号吧)来区分不同的target

当工程创建的时候,每一个target都有一个相应的编号,并且不会再改变,编号后面/*Debug*/表明这一配置属于Debug Configuration,而ci集成时一般选择release或者distribution,因此,选择对应的编号,其后面的PROVISIONING_PROFILE就是我们需要修改的字符串

以上脚本的功能就是查找7AD502241505A17900652731编号后面的PROVISIONING_PROFILE,并将该行替换为“ace6cb3b-9231-498c-acad-5ea4542f53ff”表示的mobileprovision配置文件

以上只是修改pbxproj文件的一个应用,如果你想一键修改工程Bundle Identifier,或者你想工程文件夹整理,修改pbxproj都是一种不错的选择,换一换思路,也许路就有了,祝大家玩的愉快!

上一期iOS证书及ipa包重签名探究得到唐巧前辈的推荐,感到无比荣幸,在此表示感谢,以后争取再接再厉,写出更多更好的文章,与大家分享iOS学习中的乐趣。由于唐巧前辈的推荐,最近博客访问量大增,服务器也一度宕机,最近升级了服务器配置,希望给各位朋友带来更好的访问体验,感谢大家的来访!

 

20 thoughts on “project.pbxproj,最熟悉的”陌生人”

  1. 赤壁

    我曹 这个屌 我想问下 如果我想 用命令行创建一个 使用cocoapods 的项目 然后用上面说的 方法 修改里面的build setting 整个过程 用脚本是否 真的可以实现?

    Reply
    1. 庞海礁 Post author

      原则上是可以的,因为xcode也只是为我们封装了一套操作UI,真正的实现还是底层API,cocoapods也是通过脚本实现的,所以只要你对整体结构熟悉,一般都不是问题!

      Reply
      1. 赤壁

        我看了 一下上面那个 JAVA 的 GIT 他的意思是不是说 读出来 改完以后 不能 转回 pbxproj?
        再问下 我如果想了解 整个结构 我可以在哪找到资料 苹果网站上搜了一下 感觉没有

        Reply
        1. 庞海礁 Post author

          对,三方库主要任务是负责解析,不提供修改.至于pbxproj的介绍,目前资料很少,不过文件内容很容易理解,如果你想了解某个功能,可以在xcode里面修改某项配置,然后通过git变更历史就知道pbxproj修改了哪些地方,然后利用脚本语言修改!

          Reply
          1. 赤壁

            难怪我们公司 没人搞这个呢 最近只是 发现 公司的环境很操蛋 但是 很多新人又碰到环境问题 比如 脚本替换啊 配置修改 而这帮人又很懒 只好想办法 帮他们弄个傻瓜脚本。。。

  2. Pingback: WWDC 15看点汇总 – iOS移动开发周报 – 剑客|关注科技互联网

  3. 未名湖

    请问楼主下”ci”是说的什么呀?
    还有”特别是当工程中包含Today或者Watch时”这个’today’和’watch’什么意思呀?

    Reply
    1. 庞海礁 Post author

      ci是指持续集成 Today和Watch指系统插件和iwatch啊

      Reply
  4. 未名湖

    为啥我项目中的”PROVISIONING_PROFILE”是空的呢? 我的是已经上架了好几次公司的项目,里边是空的
    PROVISIONING_PROFILE代表的是描述文件??

    Reply
  5. 匿名

    请问如/* Begin PBXFileReference section */
    1821D70D11D2873300418632 /*
    这个1821D70D11D2873300418632 可否改变

    Reply
  6. 匿名

    你好,请问如/* Begin PBXFileReference section */ 这个下面的如
    1821D70D11D2873300418632 /*。。。。。。。。。。。。。。。。
    这个1821D70D11D2873300418632 可否手动改变,然后下边引用的我也相应改变可以吗

    Reply
  7. Pingback: 利用Xcode实现自动打包 + 分发测试 – 项目经验积累与分享

  8. Pingback: iOS 自动打包工具 + 分发测试 | 神刀安全网

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注