project.pbxproj文件解析及腳本修改證書(shū)配置思路實(shí)現(xiàn)

project.pbxproj文件是XCode工程的配置文件。該文件為舊版本的plist格式內(nèi)容

大概樣式如下

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

大概分為以下幾類(lèi)信息

  • 工程中的文件關(guān)聯(lián)信息、資源關(guān)聯(lián)信息

    • PBXBuildFile 參與編譯的文件

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

  • 文件的組織結(jié)構(gòu)信息

    • PBXGroup 工程中的文件夾
  • 工程的編譯配置、證書(shū)配置信息

    • PBXResourcesBuildPhase 編譯階段的資源配置

    • PBXFrameworksBuildPhase 編譯階段的framework配置

    • PBXProject 工程信息

    • PBXNativeTarget 工程中所有target的信息

    • XCConfigurationList 每個(gè)target下包含的編譯模式,如Debug 、 Release等模式

    • XCBuildConfiguration 具體的編譯信息?,如Release模式下的編譯配置

每一項(xiàng)資源在這個(gè)文件中都有一個(gè)值作為唯一標(biāo)識(shí),如903C829A2075C24300EB9AD0。可以看做是id。

一般每個(gè)ID值后面都會(huì)有一個(gè)注釋來(lái)進(jìn)行說(shuō)明這個(gè)ID對(duì)應(yīng)的具體內(nèi)容。如903C829C2075C24300EB9AD0 /* TLauncher */,表示這個(gè)ID是代表的是TLauncher這個(gè)target。

相同類(lèi)型的資源是按段進(jìn)行整理的

每一段內(nèi)容前用/* Begin xxx section */注釋作為開(kāi)始。用/* End xxx section */ 作為這一段內(nèi)容的結(jié)束

每一項(xiàng)內(nèi)容中用isa = xxx 指示該資源所屬于的類(lèi)型

示例如下

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

第一行/* Begin PBXGroup section */ 表示下面的內(nèi)容是group相關(guān)的

第二行 694F336321538CE3008A83CF /* CustomModule */ 表示 這個(gè)ID代表的是CustomModule這個(gè)文件夾資源, 下面的內(nèi)容是這個(gè)文件夾中的詳細(xì)內(nèi)容

isa = PBXGroup表示這個(gè)資源屬于PBXGroup類(lèi)型

children屬性表示該文件夾下所有的文件,值為每個(gè)文件的ID。

最后用/* End PBXGroup section */ 表示 關(guān)于group相關(guān)的內(nèi)容全部完成。

詳細(xì)段落內(nèi)容如下

PBXBuildFile

參與編譯的文件

PBXContainerItemProxy

PBXFileReference

項(xiàng)目中的文件資源,包括源文件、app、framework等

文件引用相關(guān)內(nèi)容

PBXGroup

工程中的文件夾相關(guān)信息

示例如下

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

Begin PBXGroup section 用注釋來(lái)作為這段內(nèi)容的開(kāi)始

694F336321538CE3008A83CF 作為這個(gè)文件夾的資源標(biāo)識(shí)

children 下面放的該文件夾中的所有文件的唯一標(biāo)識(shí)。并用注釋標(biāo)明具體的文件。

PBXNativeTarget

這一段是工程中所有target的相關(guān)內(nèi)容

    /* 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這個(gè)ID就代表了TLauncher這個(gè)target

buildConfigurationList字段指明,TLauncher這個(gè)target的編譯配置列表在903C82B32075C24600EB9AD0這個(gè)ID對(duì)應(yīng)的內(nèi)容下。在這個(gè)ID的對(duì)象下就可以找到當(dāng)前target的Debug、Release等模式下的詳細(xì)編譯配置內(nèi)容

PBXProject

該工程的信息內(nèi)容。

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

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

PBXFrameworksBuildPhase 、PBXResourcesBuildPhasePBXShellScriptBuildPhase、PBXTargetDependencyPBXSourcesBuildPhase

這幾項(xiàng)內(nèi)容都是對(duì)工程在編譯階段的配置

對(duì)應(yīng)于工程中如下頁(yè)面的配置內(nèi)容

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 */

這段中的每個(gè)ID對(duì)應(yīng)的內(nèi)容為某個(gè)target下的編譯模式列表

如,903C82B32075C24600EB9AD0這個(gè)ID對(duì)應(yīng)的內(nèi)容是TLauncher這個(gè)target下的編譯模式列表

buildConfigurations字段指明了這個(gè)target下的所有編譯模式

比如903C82B52075C24600EB9AD0編號(hào)就代表Release模式下的編譯配置。

通過(guò)這個(gè)值就可以在XCBuildConfiguration編譯配置內(nèi)容段查到詳細(xì)的編譯配置信息

XCBuildConfiguration

這段中的內(nèi)容是詳細(xì)的編譯配置信息

如下所示

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;
        };

這段中的每一個(gè)ID對(duì)應(yīng)的內(nèi)容就是某一target下指定模式下的詳細(xì)編譯配置。比如TLaunchertarget下Release模式的編譯配置

包含證書(shū)配置信息等

CODE_SIGN_STYLE 簽名方式

DEVELOPMENT_TEAM 開(kāi)發(fā)者證書(shū)的team

ENABLE_BITCODE 是否打開(kāi)bitcode

PRODUCT_BUNDLE_IDENTIFIER 該模式下的bundle_id

PRODUCT_NAME 該模式下所使用的名稱(chēng)

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

PROVISIONING_PROFILE_SPECIFIER 該模式下的描述文件的名稱(chēng)

應(yīng)用場(chǎng)景

當(dāng)通過(guò)腳本進(jìn)行自動(dòng)打包時(shí),必然會(huì)涉及修改證書(shū)及bundleId。就可以通過(guò)修改該文件實(shí)現(xiàn)修改證書(shū)配置

大概思路如下。

  1. 首先,通過(guò)字符串匹配/* Begin PBXProject section */,找到工程信息內(nèi)容

  2. 在該段內(nèi)容中,通過(guò)查找targets字段。找到該工程下的所有target。通過(guò)字符串與注釋進(jìn)行匹配,找到我們需要打包的target的ID值

  3. 獲取到目標(biāo)target的ID值之后。通過(guò)注釋?zhuān)Y選出PBXNativeTarget內(nèi)容段。

  4. PBXNativeTarget內(nèi)容段中,找到targetID對(duì)應(yīng)的內(nèi)容。在這段內(nèi)容中找到buildConfigurationList字段,獲取到這個(gè)target下的編譯配置列表對(duì)象ID。

  5. 此時(shí),進(jìn)入XCConfigurationList內(nèi)容段。在該范圍中,通過(guò)上一步中的編譯配置列表對(duì)象ID,獲取該target下的配置模式列表內(nèi)容。

  6. 在配置列表中,找到需要使用的模式。拿到該模式對(duì)應(yīng)的配置對(duì)象ID值。

  7. 進(jìn)入XCBuildConfiguration編譯配置段。通過(guò)上一步中的對(duì)象ID值,定位到該配置對(duì)象。

  8. 修改該配置對(duì)象中的內(nèi)容。如可以通過(guò)修改PROVISIONING_PROFILE等字段的值實(shí)現(xiàn)更改證書(shū)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,082評(píng)論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評(píng)論 6 342
  • 未嘗其味,先聞其香,茶是以香奪人的。 愛(ài)茶的你是否曾發(fā)現(xiàn),有的茶香得沖人,未免感覺(jué)輕浮,有的茶雖然初聞香不驚人,但...
    先生百年閱讀 595評(píng)論 0 0
  • 看完唐家三少《為了你,我愿意熱愛(ài)整個(gè)世界》這部書(shū),用他的話(huà)總結(jié)了他的創(chuàng)作,他與木子的愛(ài)情:動(dòng)力源于生活,生活源于愛(ài)...
    燕紀(jì)事閱讀 826評(píng)論 0 3

友情鏈接更多精彩內(nèi)容