project.pbxproj文件解析及脚本修改证书配置思路实现

project.pbxproj文件是XCode工程的配置文件。该文件为旧版本的plist格式内容

大概样式如下

objects = {
    /* Begin PBXBuildFile section */
    2150742CBE6728E47D2531A0 /* libPods-TLauncherTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 32F7DB5B5BB30F7773A967F9 /* libPods-TLauncherTests.a */; };
}

大概分为以下几类信息

  • 工程中的文件关联信息、资源关联信息

    • PBXBuildFile 参与编译的文件

    • PBXFileReference 工程中的所有文件信息

  • 文件的组织结构信息

    • PBXGroup 工程中的文件夹
  • 工程的编译配置、证书配置信息

    • PBXResourcesBuildPhase 编译阶段的资源配置

    • PBXFrameworksBuildPhase 编译阶段的framework配置

    • PBXProject 工程信息

    • PBXNativeTarget 工程中所有target的信息

    • XCConfigurationList 每个target下包含的编译模式,如DebugRelease等模式

    • XCBuildConfiguration 具体的编译信息�,如Release模式下的编译配置

每一项资源在这个文件中都有一个值作为唯一标识,如903C829A2075C24300EB9AD0。可以看做是id。

一般每个ID值后面都会有一个注释来进行说明这个ID对应的具体内容。如903C829C2075C24300EB9AD0 /* TLauncher */,表示这个ID是代表的是TLauncher这个target

相同类型的资源是按段进行整理的

每一段内容前用/* Begin xxx section */注释作为开始。用/* End xxx section */ 作为这一段内容的结束

每一项内容中用isa = xxx 指示该资源所属于的类型

示例如下

    /* Begin PBXGroup section */
        694F336321538CE3008A83CF /* CustomModule */ = {
            isa = PBXGroup;
            children = (
                692930B821550DA80025C5A7 /* TNBluetoothJumpModel.h */,
                692930B921550DA80025C5A7 /* TNBluetoothJumpModel.m */,
            );
            path = CustomModule;
            sourceTree = "<group>";
        };
   /* End PBXGroup section */

第一行/* Begin PBXGroup section */ 表示下面的内容是group相关的

第二行 694F336321538CE3008A83CF /* CustomModule */ 表示 这个ID代表的是CustomModule这个文件夹资源, 下面的内容是这个文件夹中的详细内容

isa = PBXGroup表示这个资源属于PBXGroup类型

children属性表示该文件夹下所有的文件,值为每个文件的ID。

最后用/* End PBXGroup section */ 表示 关于group相关的内容全部完成。

详细段落内容如下

PBXBuildFile

参与编译的文件

PBXContainerItemProxy

PBXFileReference

项目中的文件资源,包括源文件、app、framework等

文件引用相关内容

PBXGroup

工程中的文件夹相关信息

示例如下

    /* Begin PBXGroup section */
        694F336321538CE3008A83CF /* CustomModule */ = {
            isa = PBXGroup;
            children = (
                692930B821550DA80025C5A7 /* TNBluetoothJumpModel.h */,
                692930B921550DA80025C5A7 /* TNBluetoothJumpModel.m */,
            );
            path = CustomModule;
            sourceTree = "<group>";
        };
   /* End PBXGroup section */

Begin PBXGroup section 用注释来作为这段内容的开始

694F336321538CE3008A83CF 作为这个文件夹的资源标识

children 下面放的该文件夹中的所有文件的唯一标识。并用注释标明具体的文件。

PBXNativeTarget

这一段是工程中所有target的相关内容

    /* Begin PBXNativeTarget section */
        903C829C2075C24300EB9AD0 /* TLauncher */ = {
            isa = PBXNativeTarget;
            buildConfigurationList = 903C82B32075C24600EB9AD0 /* Build configuration list for PBXNativeTarget "TLauncher" */;
            buildPhases = (
                63595572631C95F927286EAF /* [CP] Check Pods Manifest.lock */,
                903C82992075C24300EB9AD0 /* Sources */,
                903C829A2075C24300EB9AD0 /* Frameworks */,
                903C829B2075C24300EB9AD0 /* Resources */,
                E6369FB196A4BD1A8A8BEB4A /* [CP] Copy Pods Resources */,
                99A4370ADE41D6A2380B14D8 /* [CP] Embed Pods Frameworks */,
            );
            buildRules = (
            );
            dependencies = (
            );
            name = TLauncher;
            productName = TLauncher;
            productReference = 903C829D2075C24300EB9AD0 /* TLauncher.app */;
            productType = "com.apple.product-type.application";
        };
    /* End PBXNativeTarget section */

903C829C2075C24300EB9AD0这个ID就代表了TLauncher这个target

buildConfigurationList字段指明,TLauncher这个target的编译配置列表在903C82B32075C24600EB9AD0这个ID对应的内容下。在这个ID的对象下就可以找到当前target的DebugRelease等模式下的详细编译配置内容

PBXProject

该工程的信息内容。

/* Begin PBXProject section */
        903C82952075C24300EB9AD0 /* Project object */ = {
            isa = PBXProject;
            ...
            projectRoot = "";
            targets = (
                903C829C2075C24300EB9AD0 /* TLauncher */,
                F6886DD32086086600E80092 /* TLauncherTests */,
            );
            ...
        };
/* End PBXProject section */

比如有targets字段包含有该工程下的所有target的信息

PBXFrameworksBuildPhasePBXResourcesBuildPhasePBXShellScriptBuildPhasePBXTargetDependencyPBXSourcesBuildPhase

这几项内容都是对工程在编译阶段的配置

对应于工程中如下页面的配置内容

build_phase.jpg

XCConfigurationList

    /* Begin XCConfigurationList section */
        903C82B32075C24600EB9AD0 /* Build configuration list for PBXNativeTarget "TLauncher" */ = {
            isa = XCConfigurationList;
            buildConfigurations = (
                903C82B42075C24600EB9AD0 /* Debug */,
                903C82B52075C24600EB9AD0 /* Release */,
            );
            defaultConfigurationIsVisible = 0;
            defaultConfigurationName = Release;
        };
    /* End XCConfigurationList section */

这段中的每个ID对应的内容为某个target下的编译模式列表

如,903C82B32075C24600EB9AD0这个ID对应的内容是TLauncher这个target下的编译模式列表

buildConfigurations字段指明了这个target下的所有编译模式

比如903C82B52075C24600EB9AD0编号就代表Release模式下的编译配置。

通过这个值就可以在XCBuildConfiguration编译配置内容段查到详细的编译配置信息

XCBuildConfiguration

这段中的内容是详细的编译配置信息

如下所示

903C82B52075C24600EB9AD0 /* Release */ = {
            isa = XCBuildConfiguration;
            baseConfigurationReference = 613FB9E3814AE8F26EA310B4 /* Pods-TLauncher.release.xcconfig */;
            buildSettings = {
                ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
                CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
                CODE_SIGN_ENTITLEMENTS = TLauncher/TLauncher.entitlements;
                CODE_SIGN_IDENTITY = "iPhone Distribution";
                CODE_SIGN_STYLE = Manual;
                DEVELOPMENT_TEAM = TLWP697Z5D;
                ENABLE_BITCODE = NO;
                GCC_PRECOMPILE_PREFIX_HEADER = YES;
                GCC_PREFIX_HEADER = TLauncher/TLauncher.pch;
                INFOPLIST_FILE = TLauncher/Info.plist;
                IPHONEOS_DEPLOYMENT_TARGET = 8.0;
                LD_RUNPATH_SEARCH_PATHS = (
                    "$(inherited)",
                    "@executable_path/Frameworks",
                );
                OTHER_LDFLAGS = (
                    "$(inherited)",
                    "-ObjC",
                );
                PRODUCT_BUNDLE_IDENTIFIER = com.systoon.enterprise.huairoutong;
                PRODUCT_NAME = "$(TARGET_NAME)";
                PROVISIONING_PROFILE = "92003ec7-f84e-4214-b27d-d47767f267b6";
                PROVISIONING_PROFILE_SPECIFIER = HuaiRouTong_Distribution;
                TARGETED_DEVICE_FAMILY = 1;
                USER_HEADER_SEARCH_PATHS = (
                    "\"${PROJECT_DIR}/../Pods\"/**",
                    ...
                );
            };
            name = Release;
        };

这段中的每一个ID对应的内容就是某一target下指定模式下的详细编译配置。比如TLaunchertarget下Release模式的编译配置

包含证书配置信息等

CODE_SIGN_STYLE 签名方式

DEVELOPMENT_TEAM 开发者证书的team

ENABLE_BITCODE 是否打开bitcode

PRODUCT_BUNDLE_IDENTIFIER 该模式下的bundle_id

PRODUCT_NAME 该模式下所使用的名称

PROVISIONING_PROFILE 该模式下所使用的描述文件

PROVISIONING_PROFILE_SPECIFIER 该模式下的描述文件的名称

应用场景

当通过脚本进行自动打包时,必然会涉及修改证书及bundleId。就可以通过修改该文件实现修改证书配置

大概思路如下。

  1. 首先,通过字符串匹配/* Begin PBXProject section */,找到工程信息内容

  2. 在该段内容中,通过查找targets字段。找到该工程下的所有target。通过字符串与注释进行匹配,找到我们需要打包的target的ID值

  3. 获取到目标target的ID值之后。通过注释,筛选出PBXNativeTarget内容段。

  4. PBXNativeTarget内容段中,找到targetID对应的内容。在这段内容中找到buildConfigurationList字段,获取到这个target下的编译配置列表对象ID。

  5. 此时,进入XCConfigurationList内容段。在该范围中,通过上一步中的编译配置列表对象ID,获取该target下的配置模式列表内容。

  6. 在配置列表中,找到需要使用的模式。拿到该模式对应的配置对象ID值。

  7. 进入XCBuildConfiguration编译配置段。通过上一步中的对象ID值,定位到该配置对象。

  8. 修改该配置对象中的内容。如可以通过修改PROVISIONING_PROFILE等字段的值实现更改证书。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • 未尝其味,先闻其香,茶是以香夺人的。 爱茶的你是否曾发现,有的茶香得冲人,未免感觉轻浮,有的茶虽然初闻香不惊人,但...
    先生百年阅读 511评论 0 0
  • 看完唐家三少《为了你,我愿意热爱整个世界》这部书,用他的话总结了他的创作,他与木子的爱情:动力源于生活,生活源于爱...
    燕纪事阅读 748评论 0 3