學(xué)會使用cocoapods+workspace管理多個(gè)工程和組件化framework

本文主要內(nèi)容

  • 使用workspace對多個(gè)項(xiàng)目進(jìn)行管理
  • 工作空間中使用cocoapods管理不同項(xiàng)目的依賴
  • workspace共用自己寫的framework

Let us rock and roll!

使用workspace對多個(gè)項(xiàng)目進(jìn)行管理

首先創(chuàng)建一個(gè)新的工作空間

創(chuàng)建xcworkspace

命名為MYProjects

命名

我們獲得了一個(gè)空的MYProjects.xcworkspace文件

MYProjects.xcworkspac

假設(shè)我們有兩個(gè)工程 TestATestB

創(chuàng)建TestA

創(chuàng)建TestB

在我們目錄下創(chuàng)建了兩個(gè)工程文件和一個(gè) MYProjects.xcworkspace 文件

目錄一覽

打開MYProjects.xcworkspace 如圖所示將兩個(gè)工程(選中TestA.xcodeprojTestB.xcodeproj導(dǎo)入)導(dǎo)入進(jìn)來

導(dǎo)入工程

我們工作空間便同時(shí)存在了兩個(gè)不同的工程

工作空間

以后我們只需要打開 MYProjects.xcworkspace 便可以管理我們的工作空間了

工作空間中使用cocoapods管理不同項(xiàng)目的依賴

我們需要在目錄里面手動創(chuàng)建一個(gè)Podfile

# Uncomment the next line to define a global platform for your project
# platform :ios, '8.0'
#xcodeproj 'Portfolio/Portfolio.xcodeproj'
#source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

##設(shè)置workspace文件
workspace 'MYProjects.xcworkspace'

cd進(jìn)入工作空間目錄拙徽,執(zhí)行pod install, 進(jìn)行pod 初始化

pod install

重頭戲來了刨沦,下面我們要為針對每個(gè)項(xiàng)目配置Podfile

在此之前,大多情況下膘怕,我們開發(fā)中可能會存在兩個(gè)版本的App想诅,例如 開發(fā)版正式版,如下圖我們復(fù)制一個(gè)Target岛心,并命名為TestADevTestBDev作為開發(fā)版本来破,

復(fù)制Targe

Xcode會為我們復(fù)制的Target自動生成了一個(gè)plist文件(一個(gè)target對應(yīng)一個(gè)plist文件),名稱為 TestA copy-Info.plist, 之后我們開發(fā)版target的屬性便在這個(gè)文件中設(shè)置了

為了能夠在代碼中區(qū)分忘古,我們只需要如下設(shè)置, TestBDev設(shè)置DEV=1, TestB設(shè)置DEV=0

區(qū)分開發(fā)版和正式版

在代碼中我們只需要簡單地判斷下 DEV 便能夠區(qū)分是開發(fā)版還是正式版本了

if (DEV == 1){
        // 測試開發(fā)環(huán)境
        requestURL = "127.0.0.1"
}else{
        // 正式開發(fā)環(huán)境
        requestURL = "213.23.43.12"
}

到現(xiàn)在為止徘禁,我們工作空間有了兩個(gè)工程,兩個(gè)工程分別對應(yīng)了兩個(gè)版本

工作空間 開發(fā)版本target 正式版本target
TestA TestADev TestA
TestB TestBDev TestB

我們要在Podfile中為每個(gè)target做配置
首先我們看下項(xiàng)目 TestA 如何配置

############################################# TestA
#需要添加添加依賴的target數(shù)組
targetsArray = ['TestA', 'TestADev'] 
# 遍歷數(shù)組髓堪,分別添加依賴
for index in 0..targetsArray.length - 1 do
    # 數(shù)組中獲取元素
    proj = targetsArray[index]
    target proj do
        # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
        use_frameworks!
        # 辨識是哪個(gè)項(xiàng)目
        project 'TestA/TestA.xcodeproj'
        # Pods for TestA
        # 鍵入需要添加的依賴
        pod 'AFNetworking', '~> 3.1.0'
        
        # end Pods for TestA
        # 如果 target 下標(biāo)為1, 即只為開發(fā)板做 單元測試 和 UI測試
        if index == 0
            target proj + 'Tests' do
                inherit! :search_paths
                # Pods for testing
            end
            
            target proj + 'UITests' do
                inherit! :search_paths
                # Pods for testing
            end
        end
    end
end

TestB 配置也是一樣的送朱,最終我們得到的 Podfile 文件

# Uncomment the next line to define a global platform for your project
# platform :ios, '8.0'
#xcodeproj 'Portfolio/Portfolio.xcodeproj'
#source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'


##設(shè)置workspace文件
workspace 'MYProjects.xcworkspace'


############################################# TestA
targetsArray = ['TestA', 'TestADev']
for index in 0..targetsArray.length - 1 do
    proj = targetsArray[index]
    target proj do
        # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
        use_frameworks!
        project 'TestA/TestA.xcodeproj'
        # Pods for TestA
        pod 'AFNetworking', '~> 3.1.0'
        
        # end Pods for TestA
        # 如果 target 下標(biāo)為0, 即只為正式版做 單元測試 和 UI測試
        if index == 0
            target proj + 'Tests' do
                inherit! :search_paths
                # Pods for testing
            end
            
            target proj + 'UITests' do
                inherit! :search_paths
                # Pods for testing
            end
        end
    end
end

############################################# TestB
targetsArray = ['TestB', 'TestBDev']
for index in 0..targetsArray.length - 1 do
    proj = targetsArray[index]
    target proj do
        # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
        use_frameworks!
        project 'TestB/TestB.xcodeproj'
        # Pods for TestA
        pod 'AFNetworking', '~> 3.1.0'
        
        # end Pods for TestA
        # 如果 target 下標(biāo)為0, 即只為正式版做 單元測試 和 UI測試
        if index == 0
            target proj + 'Tests' do
                inherit! :search_paths
                # Pods for testing
            end
            
            target proj + 'UITests' do
                inherit! :search_paths
                # Pods for testing
            end
        end
    end
end

但是這樣做會有個(gè)缺陷,不同工程使用同一個(gè)不同版本的三方庫將會報(bào)錯(cuò)干旁,因?yàn)檫@樣會導(dǎo)致podfile中的版本沖突驶沼,如下所示

Analyzing dependencies
[!] Unable to satisfy the following requirements:

- `AFNetworking (~> 3.1.0)` required by `Podfile`
- `AFNetworking (~> 3.1.0)` required by `Podfile`
- `AFNetworking (= 2.6.3)` required by `Podfile`
- `AFNetworking (= 2.6.3)` required by `Podfile`

最后我們要做的就是pod install下即可了

workspace共用自己寫的framework

如法炮制,我們創(chuàng)建一個(gè)framework争群,命名為 MADFramework

創(chuàng)建framework

build一下回怜,加入工作空間,現(xiàn)在我們有四個(gè)藍(lán)色的圖標(biāo)了


工作空間

值得注意的是祭阀,我們添加的framework默認(rèn)是動態(tài)庫鹉戚,蘋果是不允許上架的 (更正下鲜戒,現(xiàn)在是允許上架的),我們需要如下圖進(jìn)行更改抹凳,將framework設(shè)置為靜態(tài)庫

更改為靜態(tài)庫

接著在framework中新建一個(gè)類MADAlert.h

#import "MADAlert.h"
#import <UIKit/UIKit.h>

@implementation MADAlert

+ (void)alert
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello ????????" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"done", nil];
    [alert show];
}
@end

如下如將需要暴露的header放入public

暴露header

為了我們其他的工程能識別我們的framework遏餐,做如下圖設(shè)置

鏈接庫

設(shè)置

ViewController代碼中添加調(diào)用代碼

#import "MADAlert.h"
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [MADAlert alert];
}

運(yùn)行下:


運(yùn)行

That all


補(bǔ)充 靜態(tài)動態(tài)庫區(qū)別:

靜態(tài)庫:鏈接階段導(dǎo)入,完整地被復(fù)制到可執(zhí)行文件赢底,使用了多少次失都,就會被拷貝多少次
動態(tài)庫:運(yùn)行時(shí)動態(tài)加載,多個(gè)程序共用, 例如系統(tǒng)的UIKit.framwork等幸冻,能夠節(jié)省內(nèi)存粹庞,減少應(yīng)用包體積

靜態(tài)庫:以.a.framework為文件后綴名。
動態(tài)庫:以.tbd(之前叫.dylib).framework為文件后綴名洽损。

靜態(tài)庫:不可以單獨(dú)使用庞溜,需要依賴.h文件調(diào)用,表現(xiàn)為二進(jìn)制文件
動態(tài)庫:可以單獨(dú)使用, 表現(xiàn)為可執(zhí)行文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碑定,一起剝皮案震驚了整個(gè)濱河市流码,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌延刘,老刑警劉巖漫试,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌骏,死亡現(xiàn)場離奇詭異澡为,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帆吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門普泡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來播掷,“玉大人,你說我怎么就攤上這事劫哼《E浚” “怎么了割笙?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵权烧,是天一觀的道長。 經(jīng)常有香客問我伤溉,道長般码,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任乱顾,我火速辦了婚禮板祝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘走净。我一直安慰自己券时,他們只是感情好孤里,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橘洞,像睡著了一般捌袜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炸枣,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天虏等,我揣著相機(jī)與錄音,去河邊找鬼适肠。 笑死霍衫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侯养。 我是一名探鬼主播敦跌,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逛揩!你這毒婦竟也來了峰髓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤息尺,失蹤者是張志新(化名)和其女友劉穎携兵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂誉,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徐紧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炭懊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并级。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侮腹,靈堂內(nèi)的尸體忽然破棺而出嘲碧,到底是詐尸還是另有隱情,我是刑警寧澤父阻,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布愈涩,位于F島的核電站,受9級特大地震影響加矛,放射性物質(zhì)發(fā)生泄漏履婉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一斟览、第九天 我趴在偏房一處隱蔽的房頂上張望毁腿。 院中可真熱鬧,春花似錦、人聲如沸已烤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胯究。三九已至塌鸯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唐片,已是汗流浹背丙猬。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费韭,地道東北人茧球。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像星持,于是被迫代替她去往敵國和親抢埋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一. CocoaPods的介紹 什么是CocoaPods督暂?CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫...
    輝712閱讀 3,918評論 0 7
  • 項(xiàng)目組件化揪垄、平臺化是技術(shù)公司的共同目標(biāo),越來越多的技術(shù)公司推崇使用pod管理第三方庫以及私有組件逻翁,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 21,637評論 0 39
  • CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個(gè)第三方庫的依賴管理工具饥努。利用 CocoaPods,...
    寶山瀟灑哥閱讀 4,027評論 0 1
  • 最幸福的就是我了 最近我喜歡上了塑身瑜伽 孩子睡著了我就跟電視上的瑜伽老師學(xué) 老師一步一步教的好詳細(xì) 練了一會覺得...
    幸福魔法師閱讀 141評論 0 0
  • 暑假因?yàn)楦鞣矫娴脑虬嘶兀瑳]能帶娃出行酷愧,心里總覺得有個(gè)遺憾。為了彌補(bǔ)遺憾缠诅,想利用國慶長假前的某個(gè)周末溶浴,全家來個(gè)親子自駕...
    俞小魚A朵朵閱讀 462評論 0 0