文章主要介紹怎么打包靜態(tài)庫(kù)(這里只說Framework
),打包bundle
,Framework聯(lián)調(diào)
租悄,以及項(xiàng)目中遇到的一些關(guān)于Framework,bundle的問題红氯。
什么是靜態(tài)庫(kù),估計(jì)很多人不會(huì)怎么關(guān)心餐胀,很多也能說出個(gè)大概棚蓄。這里三兩句就過了堕扶。
- 靜態(tài)庫(kù)
以”.a”或者“.framework”為文件后綴名
靜態(tài)庫(kù)鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝梭依。 - 動(dòng)態(tài)庫(kù)
以”.dylib”或者“.framework”為文件后綴名
動(dòng)態(tài)庫(kù)鏈接時(shí)不復(fù)制稍算,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用役拴。而且系統(tǒng)只加載一次糊探,多個(gè)程序共用,節(jié)省內(nèi)存河闰。
如何打包Framework
- 新建一個(gè)
Cocoa Touch Framework
工程
-
在新建項(xiàng)目中放入自己代碼
靜態(tài)庫(kù)設(shè)置
這里說兩句科平,一般網(wǎng)上的教程都是直接放一張簡(jiǎn)單的項(xiàng)目結(jié)構(gòu),跟一個(gè)簡(jiǎn)單的項(xiàng)目實(shí)現(xiàn)文件姜性。但是很多時(shí)候瞪慧,我們要處理的是一整個(gè)項(xiàng)目的內(nèi)容。這里是我集成完一個(gè)AR項(xiàng)目之后的感受污抬。
(1)原項(xiàng)目中引用到的
Framework
汞贸,是不會(huì)被你自己打包出來的Framework引用的,所以你打包的Framewrok中用到的第三方Framwork印机,在新的項(xiàng)目中還要再次導(dǎo)入引用。這個(gè)可以憑借平時(shí)你使用別用的Framework的時(shí)候也是需要多導(dǎo)入一些系統(tǒng)的Framework门驾,不然就會(huì)出現(xiàn)無法找到一個(gè)庫(kù)方法的錯(cuò)誤射赛。
(2)原項(xiàng)目中引用到的.a
靜態(tài)庫(kù)文件,是會(huì)被打包進(jìn)去我們的Framework的奶是,所以當(dāng)你把.a
文件在Framework引用到楣责,就不要在新項(xiàng)目中使用,不然會(huì)出現(xiàn)重復(fù)引用的錯(cuò)誤聂沙。
(3)注意Build Phases
里面的Compile Source
這里會(huì)出現(xiàn)原項(xiàng)目里面使用到的.m
實(shí)現(xiàn)文件(C++的實(shí)現(xiàn)文件也會(huì)在這里),Link Binary With Libraries
里面會(huì)出現(xiàn)原項(xiàng)目中引用到的庫(kù)秆麸,Header
會(huì)出現(xiàn)原項(xiàng)目中使用的.h
頭文件(C++的頭文件也會(huì)在這里)。這里的一個(gè)作用是把你需要暴露的頭放到Public
里面及汉,但是還有一個(gè)作用就是沮趣,可以把部分會(huì)引用到你自己的實(shí)現(xiàn)文件的第三方文件去掉關(guān)聯(lián),這里去掉關(guān)聯(lián)的意思是坷随,將不會(huì)打包進(jìn)你的Framework房铭。
這里舉個(gè)例子:
例如你的一個(gè)控制器驻龟,需要用到AppDelegate這個(gè)類,但是你如果在Framework里面添加了AppDelegate缸匪,那么就會(huì)與你新項(xiàng)目中的AppDelegate有沖突翁狐,這時(shí)候怎么辦呢?你的Framework中的AppDelegate不用刪掉凌蔬,只需要在我剛剛說的Compile Source``Header
中刪掉AppDelegate的文件露懒,然后將你需要的AppDelegate的內(nèi)容添加到新項(xiàng)目的AppDelegate中就可以了。這里只是提出一種解決方法的思路砂心,如果有更好的思路可以在下面給我留言懈词。
關(guān)于Framework
我一開始不太會(huì)用,所以試著把xib计贰,圖片資源放到了Framework
里面钦睡,后來從網(wǎng)上找來說這些資源都是放在bundle里面。Framework包內(nèi)容是有這些圖片和xib資源的躁倒,但是當(dāng)你導(dǎo)入到工程里面荞怒,你就看不見這些內(nèi)容,所以估計(jì)這種想把資源放在Framework里面是不可行的吧秧秉。
如何打包Bundle
- 點(diǎn)擊工程在
TARGETS
下方的+
,在masOS
選擇bundle
-
Build Settings
修改Base SDK
->Latest iOS
-
Build Phases
將需要的xib褐桌,圖片資源添加到Copy Bundle Resources
-
Combine High Resolution Artwork
或COMBINE_HIDPI_IMAGES
這兩項(xiàng)一個(gè)是OSX下的名字,一個(gè)是iOS下的名字,改為NO
才可以存圖片,不然存進(jìn)去是tiff - 然后
build
就會(huì)生成需要bundle
文件
注意:
1.這里有兩種方式導(dǎo)入原項(xiàng)目中的文件。
- 用'Asset.xcassets'導(dǎo)入圖片象迎,然后在
Copy Bundle Resources
里面添Asset.xcassets
- 直接將圖片導(dǎo)入項(xiàng)目荧嵌,然后在'Copy Bundle Resources'添加
第一種
如果你只是單純的想把你原項(xiàng)目中的
xib
中用到的圖片資源打包進(jìn)bundle
你最好是使用第一種,而且是將原項(xiàng)目的整個(gè)Asset.xcassets
內(nèi)容復(fù)制過去砾淌。因?yàn)橛袝r(shí)候我們?yōu)榱碎_發(fā)的方便啦撮,把圖片資源放入Asset.xcassets
之后,還會(huì)進(jìn)行名字的修改汪厨,這個(gè)時(shí)候我們xib
使用的只是一個(gè)假的圖片的名字赃春,如果你之間將你們UI同事給的切圖文件夾全部?jī)?nèi)容拿過去用。這個(gè)時(shí)候可能會(huì)出現(xiàn)
Could not load the "ic_lingqujiangli_13" image referenced from a nib in the bundle with identifier "com.Gemo.InterestingARBundle"
這樣子的錯(cuò)誤劫乱。因?yàn)槟闶褂玫膱D片的名字是一個(gè)假的名字织中,可以理解為Xcode為我們做的一個(gè)索引,讓我們?nèi)フ业秸媸堑膱D片衷戈,然而如果你只把真實(shí)名字圖片放進(jìn)去狭吼,它是找不到,因此要放一個(gè)Asset.xcassets
殖妇。但是刁笙,你會(huì)發(fā)現(xiàn),你在代碼里面使用類似
[UIImage imageNamed:@"ImageName"];
會(huì)奇怪的找不到圖片。也是同樣的報(bào)出上面的提示采盒。你會(huì)想旧乞,我不是把圖片放在了Asset.xcassets
里面并且加進(jìn)去了嗎?
第二種磅氨。
你在原項(xiàng)目里面使用代碼去獲取圖片尺栖,你可以思考一下他會(huì)從哪些地方去拿這個(gè)圖片?我可以告訴你烦租,如果在新項(xiàng)目中添加這個(gè)圖片資源是可以獲取到的延赌。但是你如果給別人打包的一個(gè)Framework
和bundle
文件,難道你還想單獨(dú)給別人幾張圖片嗎叉橱?所以這時(shí)候我們需要將圖片資源單獨(dú)添加到bundle
的Copy Bundle Resources
中挫以。
把同一圖片用兩種方式添加,并且修改Asset中圖片名字
如何使用
bundle
中的xib,圖片資源
因?yàn)楝F(xiàn)在讀取圖片跟xib的資源都不是MainBundle中獲取了窃祝,所以需要對(duì)源頭進(jìn)行切換掐松。xib讀取方式
- (instancetype)init{
NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"TestFrameworkBundle" ofType:@"bundle"]];
self = [super initWithNibName:NSStringFromClass([self class]) bundle:bundle];
return self;
}圖片讀取方式(代碼中使用圖片)
[UIImage imageNamed:@"TestFrameworkBundle.bundle/ic_zuobiao"];
如何將打包的Framewoek,bundle粪小,和測(cè)試工程整合一起聯(lián)調(diào)
- 在當(dāng)前的Framework工程在添加一個(gè)
target
->Single View Application
-
TARGETS
中選中新加的app,設(shè)置Build Phases
為上面生成的Framework,Copy Bundle Resources
為上面生成的bundle大磺,可以用右鍵查看framework和bundle的路徑,如果看到上一級(jí)目錄的是Debug
或者Release
開頭探膊,那你就可以放心的調(diào)試了杠愧。
最后的最后 附上本文代碼地址 覺得好的同學(xué)幫忙點(diǎn)個(gè)star 謝謝??