IOS開發中製做屬於本身的靜態庫.a、資源庫.bundle、.framework

1、什麼是庫ios

 

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

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

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

 

2、什麼是.a、.bundle、.framework模塊化

 

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

       之因此.framework既多是動態庫又多是靜態庫,是由於蘋果公司禁止用戶級App使用動態庫,而本身卻又冠冕堂皇的使用動態庫,這就形成了iOS中系統級的.framework是動態庫,用戶級的.framework是靜態庫。ui

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

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

 

3、靜態庫使用的必要性圖片

 

   1>.  代碼的共享與重用

    2>.  程序模塊化

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

    4>.  開發第三方SDK

 

 

4、.a靜態庫文件

 

一、點擊建立Project

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

三、根據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

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

 

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

 

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

 

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

 

5、資源庫.bundle

 

一、bundle資源庫的特色

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

二、新建.bundle

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

固然,默認的配置也是能夠的,若是你須要特定的優化或者特定的路徑配置,你能夠進行下面第4步的配置。
四、進行可選設置
資源包只須要編譯不須要安裝
 
 
五、編譯便可生成.bundle文件,導入項目中
 
六、調用方式
 

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

    image.backgroundColor = [UIColorredColor];

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

    [self.viewaddSubview:image];

5、.framework
 
一、建立
 
二、Build Phases -> Headers,能夠看出有三個選項,分別是Public,Private,Project;把須要暴露給別人的.h文件拖到Public中,剩下的不要暴露的,即爲隱藏的文件,放在Project中
 
 
三、把全部須要暴露的.h文件都用#import<TestFramework/TestLibrary.h>引入,記住必定要將全部的須要暴露的.h文件都寫在給定的.h文件中,否則編譯後生成的.framework在引用的時候會有警告。
 
 
四、新建一個Target,選擇Other - >Aggregate
 
 
五、選中新建的Target,點擊Build Pharas ,選中左上角的+,New Run Script Phase,添加腳本
 
腳本用於合併Framework,真機和模擬器版本,以及armv7 armv7s arm64等不一樣architectures

# Sets the target folders and the final framework product.

# 若是工程名稱和Framework的Target名稱不同的話,要自定義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/"

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

 
 
七、選中Aggregate,進行編譯,編譯成功後自動打開product文件夾
 
 
八、打開終端,能夠查看支持的架構
 

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

 

 

九、導入項目中便可使用

 

注意:運行的xcode版本是7.3

相關文章
相關標籤/搜索