本文主要內(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è)新的工作空間
命名為MYProjects
我們獲得了一個(gè)空的MYProjects.xcworkspace
文件
假設(shè)我們有兩個(gè)工程 TestA 和 TestB
在我們目錄下創(chuàng)建了兩個(gè)工程文件和一個(gè) MYProjects.xcworkspace 文件
打開MYProjects.xcworkspace 如圖所示將兩個(gè)工程(選中TestA.xcodeproj 和 TestB.xcodeproj導(dǎo)入)導(dǎo)入進(jìn)來
我們工作空間便同時(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 初始化
重頭戲來了刨沦,下面我們要為針對每個(gè)項(xiàng)目配置Podfile
在此之前,大多情況下膘怕,我們開發(fā)中可能會存在兩個(gè)版本的App想诅,例如 開發(fā)版 和 正式版,如下圖我們復(fù)制一個(gè)Target岛心,并命名為TestADev和TestBDev作為開發(fā)版本来破,
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
在代碼中我們只需要簡單地判斷下 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
build一下回怜,加入工作空間,現(xiàn)在我們有四個(gè)藍(lán)色的圖標(biāo)了
值得注意的是祭阀,我們添加的framework默認(rèn)是動態(tài)庫鹉戚,
蘋果是不允許上架的(更正下鲜戒,現(xiàn)在是允許上架的),我們需要如下圖進(jìn)行更改抹凳,將framework設(shè)置為靜態(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
為了我們其他的工程能識別我們的framework
遏餐,做如下圖設(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)行下:
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í)行文件