iOS 開發中製作靜態庫.a、資源庫.bundle、.framework

一、什麼是庫

       庫實際上是一種代碼共享的方式,主要用於代碼重用和源碼隱藏,通常分爲動態庫和靜態庫。

       靜態庫:鏈接時完整的拷貝至可執行文件中,被多次使用就有多份冗餘拷貝。

       動態庫:鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存空間。


二、什麼是.a、.bundle、.framework


       在iOS中靜態庫以.a和.framework的形式存在,動態庫以.dylib和.framework的形式存在。

       之所以.framework既可能是動態庫又可能是靜態庫,是因爲蘋果公司禁止用戶級App使用動態庫,而自己卻又堂而皇之的使用動態庫,這就造成了iOS中系統級的.framework是動態庫,用戶級的.framework是靜態庫

        二者區別不大,.a是純二進制文件,.a文件不能單獨使用,至少要有.h文件配合,而.framework除了二進制文件外,還包含一些資源文件(頭文件,plist等),由於自身包含了頭文件,所以.framework可以單獨使用。

          .a和.framework兩種靜態庫,通常都是把需要用的到圖片或者xib文件存放在一個bundle文件中,而該bundle文件的名字和.a或.framework的名字相同。關於bundle文件的製作方法,後面有專門介紹。



三、靜態庫使用的必要性


   1>.  代碼的共享與重用

    2>.  程序模塊化

    3>.  分享給別人代碼庫時代碼隱藏

    4>.  開發第三方SDK


四、.a靜態庫文件


1、點擊創建Project


2、在.m和.h中進行代碼編寫

3、根據armv7和arm64打包兩個.a進行合併

合併兩個.a文件

lips -create /Users/tiansha/Desktop/libTestLibrary.a /Users/tiansha/Desktop/Demo/Shengshihuihai/ShengShiHuiHai/Resource/libTestLibrary.a -output /Users/tiansha/Desktop/libTestLibrary2.a

模擬器包和真機包也可以用該方法進行合併。


4、合併後導入到項目中,並把.h文件與.a 文件一起導入到項目中



5、編譯項目,導融TestLibrary 即可調用.a中的方法



總結:.a文件需要模擬器和真機文件進行合併後項目中才都可以使用,避免切換造成的開發成本高的問題。


五、資源庫.bundle


1、bundle資源庫的特點

Bundle是靜態的,也就是說,我們包含到包中的資源文件作爲一個資源包是不參加項目編譯的。也就意味着,bundle包中不能包含可執行的文件。它僅僅是作爲資源,被解析成爲特定的2進制數據。

2、新建.bundle


3、加入你需要編譯在bundle中的資源文件。

當然,默認的配置也是可以的,如果你需要特定的優化或者特定的路徑配置,你可以進行下面第4步的配置。
4、進行可選設置
資源包只需要編譯不需要安裝



5、編譯即可生成.bundle文件,導入項目中


6、調用方式

    UIImageView *image = [[UIImageViewalloc]initWithFrame:CGRectMake(0,0,320,480)];

    image.backgroundColor = [UIColorredColor];

    image.image = [UIImageimageNamed:@"TestBundle.bundle/Contents/Resources/1.png"];

    [self.viewaddSubview:image];


五、.framework

1、創建


2、Build Phases -> Headers,可以看出有三個選項,分別是Public,Private,Project;把需要暴露給別人的.h文件拖到Public中,剩下的不要暴露的,即爲隱藏的文件,放在Project中



3、把所有需要暴露的.h文件都用#import<TestFramework/TestLibrary.h>引入,記住一定要將所有的需要暴露的.h文件都寫在給定的.h文件中,不然編譯後生成的.framework在引用的時候會有警告。



4、新建一個Target,選擇Other - >Aggregate



5、選中新建的Target,點擊Build Pharas ,選中左上角的+,New Run Script Phase,添加腳本



腳本用於合併Framework,真機和模擬器版本,以及armv7 armv7s arm64等不同architectures

# Sets the target folders and the final framework product.

如果工程名稱和FrameworkTarget名稱不一樣的話,要自定義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}/"


# 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 "${SRCROOT}/Products/"


6、選中Targets中的第一個Target,點擊Build Setting -> Mach-O Type,選擇Static Library,到這裏會有一個問題存在,就是無法在iPhone5c上使用.framework,這是我們需要在Build Setting -> Architectures ->Architectures中添加armv7s




7、選中Aggregate,進行編譯,編譯成功後自動打開product文件夾



8、打開終端,可以查看支持的架構

lipo -info /Users/tiansha/Desktop/Demo/TestFramework/Products/TestFramework.framework/TestFramework




9、導入項目中即可使用



發佈了60 篇原創文章 · 獲贊 17 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章