一洒试、前言
由于項(xiàng)目有大幅度的改動,需要涉及到資源文件以及編譯文件的內(nèi)容修改朴上。
但是我們的項(xiàng)目中存在多個(gè)target垒棋,只更改指定的target。
那么問題來了:
如何獲得指定target的資源文件以及編譯文件痪宰?
二叼架、思路
第一時(shí)間就想到xcode中target對應(yīng)的Build Phases有對應(yīng)的數(shù)據(jù),那么它是如何獲得的了酵镜?
經(jīng)過一系列的深入思考(日常谷歌)碉碉,得知xcode實(shí)質(zhì)是從project.pbxproj獲取到的信息。
那么問題就變成了:
如何從pbxproj文件中提取出對應(yīng)target的信息淮韭!
一開始我嘗試使用python的腳本來解析垢粮,結(jié)果發(fā)現(xiàn)·····
(有興趣的自己嘗試,我其實(shí)是忘記了發(fā)現(xiàn)了什么··靠粪,因?yàn)檫@片文章實(shí)現(xiàn)的東西已經(jīng)是兩月以前的東西了蜡吧,只是一直加班忙毫蚓,最近才寫出來·· )
總之后來就寫了MacPbxprojHelper,這樣一個(gè)提取指定target編譯和資源文件的東西··
三昔善、簡單介紹
使用方式
1 元潘、下載MacPbxprojHelper,運(yùn)行君仆,得到界面如下:
2翩概、點(diǎn)擊界面上的導(dǎo)入按鈕,導(dǎo)入.xcodeproj文件
3返咱、在項(xiàng)目target列表钥庇,選中需要導(dǎo)出編譯或者資源文件的target
4、點(diǎn)擊提取資源文件(編譯文件)
文件中獲取的到的編譯文件基礎(chǔ)格式如下
/MacPbxprojHelper/PropertyListHandler.m
/MacPbxprojHelper/PropertyListHandler.m
5咖摹、提取出來的文件位于和導(dǎo)入的.xcodeproj文件同一路徑
操作流程如下圖:
代碼說明
代碼中可配置部分內(nèi)容均位于ViewController.m文件中
可配置的內(nèi)容包含
- 可過濾資源文件類型
///過濾指定type的資源文件數(shù)據(jù)
+ (NSArray *)FliterFileTypeArr
{
static NSArray * fileTypes = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
fileTypes = @[];
});
return fileTypes;
}
- 可添加路徑前綴
//路徑前綴 便于后續(xù)用腳本讀入 編輯內(nèi)容
+ (NSString *)FilePrefixString
{
return @"./ABC/";
}
- 可過濾文件目錄
///過濾指定文件路徑下的文件
+ (NSArray *)FliterFileFolders
{
static NSArray * fileFolderArr = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
fileFolderArr = @[];
});
return fileFolderArr;
}
當(dāng)然也可根據(jù)個(gè)人需要到代碼中添加前綴评姨,刪除路徑,刪除后綴等操作萤晴,在ViewControler.m文件中的createMFilePathBtnClick:方法里
- (IBAction)createMFilePathBtnClick:(NSButton *)sender {
if (self.selectedIndex >= 0 && self.selectedIndex < self.projectModel.rootModel.targets.count) {
[self.sourcePathArr removeAllObjects];
ProjectTargetModel * model = self.projectModel.rootModel.targets[self.selectedIndex];
ProjectBuildPhaseModel * phaseModel = [model getSourceModel];
for (ProjectBuildFileModel * fileModel in phaseModel.files) {
NSString * path = [self.projectModel.rootModel findPathWithBuildFile:fileModel];
//于這里對類名進(jìn)行增刪吐句,達(dá)到定制化目的
NSString * newPath = [NSString stringWithFormat:@"%@%@",[ViewController FilePrefixString],path];
if (path.length > 0) {
BOOL isNeedFliter = NO;
for (NSString * folderName in [ViewController FliterFileFolders]) {
if([newPath containsString:folderName])
{
isNeedFliter = YES;
break;
}
}
if (!isNeedFliter) {
[self.sourcePathArr addObject:newPath];
}
}
}
[self saveArr:self.sourcePathArr fileName:[NSString stringWithFormat:@"%@_source",model.name]];
}
}