原創(chuàng)精選來(lái)自我的博客文章
目錄
- framework了解
- [制作 framework](#制作 framework)
- [Xcode 中創(chuàng)建一個(gè)空的 framework](#Xcode 中創(chuàng)建一個(gè)空的 framework)
- 更改參數(shù)
- 創(chuàng)建自己功能類(lèi)代碼
- [設(shè)置 Headers 和 Resources](#設(shè)置 Headers 和 Resources)
- 編譯與合并
- [在其他地方使用我們的 framework](#在其他地方使用我們的 framework)
- 注意事項(xiàng)
- Reference
<a id="framework了解"></a>framework了解
一、什么是庫(kù)?
庫(kù)是共享程序代碼的方式掏熬,一般分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兆龙。
二要糊、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別
靜態(tài)庫(kù):鏈接時(shí)完整地拷貝至可執(zhí)行文件中贤牛,被多次使用就有多份冗余拷貝。
動(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)存脐嫂。
三统刮、iOS里靜態(tài)庫(kù)形式
.a
和.framework
四、iOS里動(dòng)態(tài)庫(kù)形式
.dylib
和.framework
五账千、framework為什么既是靜態(tài)庫(kù)又是動(dòng)態(tài)庫(kù)侥蒙?
系統(tǒng)的
.framework
是動(dòng)態(tài)庫(kù),我們自己創(chuàng)建的.framework
是靜態(tài)庫(kù)匀奏。
六鞭衩、.a 和 .framework 有什么區(qū)別
.a
是一個(gè)純二進(jìn)制文件,.framework
中除了有二進(jìn)制文件之外還有資源文件娃善。
.a
文件不能直接使用论衍,至少要有.h
文件配合,.framework
文件可以直接使用聚磺。
.a + .h + sourceFile = .framework
七坯台、為什么要使用靜態(tài)庫(kù)?
方便共享代碼咧最,便于合理使用捂人。
實(shí)現(xiàn)iOS程序的模塊化御雕,可以把固定業(yè)務(wù)模塊化成靜態(tài)庫(kù)矢沿。
和別人分享你的代碼庫(kù),但是不想讓別人看到你的代碼實(shí)現(xiàn)酸纲。
開(kāi)發(fā)第三方sdk的需求捣鲸。
<a id="制作 framework"></a>制作 framework
Xcode版本: 8.3.2 (8E2002)
<a id="Xcode 中創(chuàng)建一個(gè)空的 framework"></a>1、Xcode 中創(chuàng)建一個(gè)空的 framework
Xcode:
File -> New -> Project -> Framework & Library -> Cocoa Touch Framework
<a id="更改參數(shù)"></a>2闽坡、更改參數(shù)
2.1栽惶、TARGET -> Build Settings -> Architectures
2.2、TARGET -> Build Settings -> Linking
下更改幾個(gè)參數(shù)
2.3疾嗅、對(duì)于使用category
時(shí)外厂,必須配置 Other Linker Flags
為 -ObjC
<a id="創(chuàng)建自己功能類(lèi)代碼"></a>3、創(chuàng)建自己功能類(lèi)代碼
<a id="設(shè)置 Headers 和 Resources"></a>4代承、設(shè)置 Headers 和 Resources
在
TARGETS
->Build Phases
->Headers
中添加頭文件汁蝶,Public 中添加公開(kāi)的頭文件在
TARGETS
->Build Phases
->Copu Bundle Resources
中添加framework中使用的bundle資源文件
<a id="編譯與合并"></a>編譯與合并
合并則分為兩種,一個(gè)手動(dòng)论悴,一個(gè)腳本
如果打包出去只需要真機(jī)或者模擬器中的一種掖棉,那么我們只需編譯就可以得到,合并是為了同時(shí)滿(mǎn)足模擬器和真機(jī)進(jìn)行的操作膀估。
1幔亥、在模擬器 和 真機(jī) 環(huán)境下分別編譯我們的 framework
隨便選擇一個(gè)
simulator
和Generic Device
(代表真機(jī)) 分別編譯 command + B
2、選中我們的 framework察纯,右鍵在Finder中顯示帕棉,并找到對(duì)應(yīng)環(huán)境 .framework文件夾下的文件
Debug-iphoneos
代表debug狀態(tài)下真機(jī)編譯結(jié)果
Debug-iphonesimulator
代表debug狀態(tài)下模擬器編譯結(jié)果在真實(shí)上架項(xiàng)目中针肥,我們就是需要編譯
release
版本
3、將模擬器和真機(jī)編譯得到的文件進(jìn)行合并香伴,生成一個(gè)真機(jī)模擬器同時(shí)兼容的文件
3.1祖驱、手動(dòng)合并
-
終端輸入命令語(yǔ)句
合并的文件路徑:在某個(gè)地方創(chuàng)建一個(gè)文件,命名和我們編譯得到文件的名字一致瞒窒,然后拖拉文件到終端即可得到路徑 在終端中使用命令時(shí)捺僻,這些路徑都只要直接托拉過(guò)來(lái) $ lipo -create 真機(jī)文件路徑 模擬器文件路徑 -output 合并得到的文件路徑
合并得到文件 替換 真機(jī)編譯得到的
.framework
文件下的文件(或者用模擬器編譯得到的也一樣),即可得到最終模擬器和真機(jī)都可使用的framework
3.2崇裁、腳本合并
- Xcode:
File -> New -> Target
在當(dāng)前庫(kù)路徑下創(chuàng)建腳本所需的文件匕坯,任意命名即可
- 添加運(yùn)行的腳本
-
具體腳本內(nèi)容
# Sets the target folders and the final framework product. # 如果工程名稱(chēng)和Framework的Target名稱(chēng)不一樣的話(huà),要自定義FMKNAME # 例如: FMK_NAME = "MyFramework" FMK_NAME=${PROJECT_NAME} # Install dir will be the final output to the framework. # The following line create it in the root folder of the current project. INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework # Working dir will be deleted after the framework creation. WRK_DIR=build DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework # -configuration ${CONFIGURATION} # Clean and Building both architectures. xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build # Cleaning the oldest. if [ -d "${INSTALL_DIR}" ] then rm -rf "${INSTALL_DIR}" fi mkdir -p "${INSTALL_DIR}" cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/" cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/" # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}" rm -r "${WRK_DIR}" open "${INSTALL_DIR}"
編譯腳本拔稳,同前面編譯framework一樣葛峻,編譯完成會(huì)自動(dòng)彈出真機(jī)和模擬器都可使用的
framework
<a id="在其他地方使用我們的 framework"></a>在其他地方使用我們的 framework
1、將符合要求的 framework 拖拉到其他項(xiàng)目中巴比,如果有 bundle 資源文件术奖,那么也必須單獨(dú)拖拉一份到項(xiàng)目中去
2、檢查是否添加完全
<a id="注意事項(xiàng)"></a>注意事項(xiàng)
1轻绞、當(dāng)framework
不是同時(shí)支持模擬器和真機(jī)的時(shí)候采记,運(yùn)行項(xiàng)目則會(huì)出現(xiàn)以下的問(wèn)題
<a id="Reference"></a>Reference
- 打包到appstore出現(xiàn)的問(wèn)題,后面遇到作為一個(gè)參考
- 更多的一些注意事項(xiàng)
- bitcode錯(cuò)誤政勃,打包的時(shí)候可能會(huì)遇到唧龄,后期參考
原創(chuàng)文章來(lái)自 我的博客