介紹###
動(dòng)態(tài)庫(kù)形式:.dylib和.framework
靜態(tài)庫(kù)形式:.a和.framework
framework為什么既是靜態(tài)庫(kù)又是動(dòng)態(tài)庫(kù)?
系統(tǒng)的.framework是動(dòng)態(tài)庫(kù)既绩,我們自己建立的.framework是靜態(tài)庫(kù)概龄。
- 什么是framework
framework是Cocoa/Cocoa Touch程序中使用的一種資源打包方式,可以將將代碼文件饲握、頭文件私杜、資源文件、說(shuō)明文檔等集中在一起救欧,方便開(kāi)發(fā)者使用衰粹。
Cocoa/Cocoa Touch開(kāi)發(fā)框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等笆怠。需要注意的是铝耻,這些framework無(wú)一例外都是動(dòng)態(tài)庫(kù)。
平時(shí)我們用的第三方SDK的framework都是靜態(tài)庫(kù)蹬刷,真正的動(dòng)態(tài)庫(kù)是上不了AppStore的瓢捉。
-
動(dòng)態(tài)庫(kù)的作用
應(yīng)用插件化:每一個(gè)功能點(diǎn)都是一個(gè)動(dòng)態(tài)庫(kù),在用戶想使用某個(gè)功能的時(shí)候讓其從網(wǎng)絡(luò)下載办成,然后手動(dòng)加載動(dòng)態(tài)庫(kù)泡态,實(shí)現(xiàn)功能的的插件化
共享可執(zhí)行文件:
在其它大部分平臺(tái)上,動(dòng)態(tài)庫(kù)都可以用于不同應(yīng)用間共享迂卢,這就大大節(jié)省了內(nèi)存某弦。從目前來(lái)看,iOS仍然不允許進(jìn)程間共享動(dòng)態(tài)庫(kù)而克,即iOS上的動(dòng)態(tài)庫(kù)只能是私有的靶壮,因?yàn)槲覀內(nèi)匀徊荒軐?dòng)態(tài)庫(kù)文件放置在除了自身沙盒以外的其它任何地方。
不過(guò)iOS8上開(kāi)放了App Extension功能员萍,可以為一個(gè)應(yīng)用創(chuàng)建插件腾降,這樣主app和插件之間共享動(dòng)態(tài)庫(kù)還是可行的。(還需了解下App Extension)
Xcode原生支持創(chuàng)建動(dòng)態(tài)庫(kù)工程###
Xcode6之后蘋果在iOS上開(kāi)放了動(dòng)態(tài)庫(kù)碎绎。
創(chuàng)建:File->New->Project
WWDC2014之iOS使用動(dòng)態(tài)庫(kù)中有很詳細(xì)的創(chuàng)建動(dòng)態(tài)庫(kù)和使用動(dòng)態(tài)庫(kù)的教程螃壤。
看教程中遇到的問(wèn)題
第一步中創(chuàng)建動(dòng)態(tài)庫(kù)run之后生成動(dòng)態(tài)庫(kù),在products目錄下面混卵。生成的是.framework映穗。
如果要生成.dylib,首先.xcodeproj文件顯示包內(nèi)容幕随,然后打開(kāi)project.pbxproj蚁滋,修改
productType = "com.apple.product-type.framework"; => productType = "com.apple.product-type.library.dynamic"。最后run之后就會(huì)生成.dylib的動(dòng)態(tài)庫(kù)。
第二步創(chuàng)建通用動(dòng)態(tài)庫(kù):File->New->Targets
使用動(dòng)態(tài)庫(kù):文章的demo例子在使用動(dòng)態(tài)庫(kù)的時(shí)候辕录,是取的沙盒里面的動(dòng)態(tài)庫(kù)路徑睦霎,而文中只是將framework作為資源文件拷貝到Bundle中。那么應(yīng)該先把Bundle中的framework再拷貝一份到沙盒目錄中才能使用走诞。所以在viewDidLoad的時(shí)候拷貝副女。
NSString *path = [[NSBundle mainBundle] pathForResource:@"Dylib" ofType:@"framework"];
NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/Dylib.framework",NSHomeDirectory()];
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error;
BOOL isSuccess = [fm copyItemAtPath:path toPath:documentsPath error:&error];
這樣就能用動(dòng)態(tài)庫(kù)了,在模擬器上沒(méi)問(wèn)題蚣旱,但是在真機(jī)上iOS8運(yùn)行正常碑幅,iOS9上會(huì)報(bào)錯(cuò):bundle is damaged or missing necessary resources。有人說(shuō)是需要重新申請(qǐng)證書塞绿,但不知道到底怎么弄肮嫡恰?
如果要把動(dòng)態(tài)庫(kù)轉(zhuǎn)成靜態(tài)庫(kù)只要修改個(gè)參數(shù)run一下就行了异吻。使用也只要像普通第三方庫(kù)一樣簡(jiǎn)單使用就好了裹赴。
Xcode安裝iOSOpenDev插件###
這是一個(gè)越獄開(kāi)發(fā)環(huán)境,生成的動(dòng)態(tài)庫(kù)直接就是.dylib文件诀浪。
新建動(dòng)態(tài)庫(kù)工程:File->New->Project->iOSOpenDev->Cocoa Touch Library棋返。
參考###
WWDC2014之iOS使用動(dòng)態(tài)庫(kù)
在你的 Mac 上安裝 dpkg 命令,實(shí)現(xiàn)解包/打包 deb 教程
真正成功的theos環(huán)境配置
IOSOpenDev越獄開(kāi)發(fā)環(huán)境配置