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 、PBXResourcesBuildPhase、PBXShellScriptBuildPhase、PBXTargetDependency、PBXSourcesBuildPhase
這幾項(xiàng)內(nèi)容都是對(duì)工程在編譯階段的配置
對(duì)應(yīng)于工程中如下頁(yè)面的配置內(nèi)容

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ū)配置
大概思路如下。
首先,通過(guò)字符串匹配
/* Begin PBXProject section */,找到工程信息內(nèi)容在該段內(nèi)容中,通過(guò)查找
targets字段。找到該工程下的所有target。通過(guò)字符串與注釋進(jìn)行匹配,找到我們需要打包的target的ID值獲取到目標(biāo)
target的ID值之后。通過(guò)注釋?zhuān)Y選出PBXNativeTarget內(nèi)容段。在
PBXNativeTarget內(nèi)容段中,找到targetID對(duì)應(yīng)的內(nèi)容。在這段內(nèi)容中找到buildConfigurationList字段,獲取到這個(gè)target下的編譯配置列表對(duì)象ID。此時(shí),進(jìn)入
XCConfigurationList內(nèi)容段。在該范圍中,通過(guò)上一步中的編譯配置列表對(duì)象ID,獲取該target下的配置模式列表內(nèi)容。在配置列表中,找到需要使用的模式。拿到該模式對(duì)應(yīng)的配置對(duì)象ID值。
進(jìn)入
XCBuildConfiguration編譯配置段。通過(guò)上一步中的對(duì)象ID值,定位到該配置對(duì)象。修改該配置對(duì)象中的內(nèi)容。如可以通過(guò)修改
PROVISIONING_PROFILE等字段的值實(shí)現(xiàn)更改證書(shū)。