iOS製作framework

framework的使用十分方便,一般來說直接拖入到項目中就可以直接使用接口,而不用在意具體的實現細節,對於功能的封裝是個很好的途徑。當我們寫的工具給別人使用的同時又不想讓別人知道自己的代碼,這個時候使用framework就可以派上用場了(ps:個人覺得開源是一個大牛必須要體會到的思想)。。。

廢話不多說,xcode如今已經到了7,對於framework的製作可以說是十分方便了。公司之前的framework的製作都是採用執行純腳本的方法,可以直接命令行編譯和融合不同版本(模擬器,真機,debug,release)的framework,個人不是很喜歡,還是喜歡用較爲官方的方式來製作framework,當然爲了方便還是少量地參照了網上的一些腳本。

一、新建framework工程


xcode->file->new->project選中iOS下的cocoa touch framework->next


創建工程

接下來的步驟和創建一個普通的工程沒什麼區別,創建完畢以後在工程中新建JRModel類和JRModel2類文件,在我們的framework工程創建以後系統會默認創建一個和工程名相同的頭文件,我這裏是JRDataModel.h。一般來說我們會把framework中需要提供給外部的頭文件都在這個頭文件中import一下,這樣使用者只要包含一個頭文件就可以使用所有的類了。


創建文件後導入公共頭文件

這個地方需要注意到兩點,一個就是導入的時候必須要使用framework的方式導入,使用<包名/頭文件名.h>,因爲在實際使用framework的時候是需要從包中搜索頭文件的。還有一個坑就是右邊的那個設置,對於總的頭文件還有所有需要用到的頭文件,都需要公開,選中以後把右邊包的編譯屬性改爲public,否則打出來的包在別的工程中實際上是不能引用的。

二、編譯工程


接下來就是開始編譯工程了(如下圖),選中運行按鈕右邊的編譯目標,選擇Generic iOS Device,然後command+b編譯一下,這個時候我們工程中的products文件夾下面的framework文件會由原來的紅色(表示文件丟失)變成黑色(表示文件存在)。如果我們選擇的是Generic iOS Device那麼編譯出來的framework只能在真機中使用,如果選中的是普通的模擬器,那麼編譯出來framewo只能在模擬器中使用。

tips:這裏需要注意一下,如果一開始選擇的是模擬器,那麼即使build成功,framework也不會變成黑色,可能是因爲這裏的framework指向的是真機中對應的framework,但是在相對應的目錄下的模擬器對應的framework是存在的


編譯framework

右擊生成好的framework,選中show in finder可以查看framework在磁盤中的位置。進入目錄以後,一般來說最多有四個目錄,我這裏只有三個(如下圖)因爲對於模擬器一般不會要release版本的。也可以通過finder,快捷鍵control+command+g輸入~/Library/Developer/Xcode/DerivedData/Build/Products默認路徑進入


分別在模擬器和真機選項中編譯,發現實際只產生了模擬器和真機的debug版本的framework包,而沒有release版本的包。這需要我們調整一下xcode的build類型,選中運行的target在下來列表中選Edit Scheme,進入以後把run中的Build Configureation修改爲Release,這時候就可以編譯出release版本的包了(如下圖)



三、合併framework


到此,我們已經製作出對於各種情況下使用的framework了,對於不同的環境需要使用不同種類的framework,這在很多時候顯得很麻煩。能不能製作一個能在所有場景使用的包呢。

這個時候我們可以考慮合併所有版本的包,一般來說可以使用腳本進行合併,但是每次使用腳本比較麻煩,我們可以在xcode中添加一個共同體aggregate,然後添加編譯腳本來實現。

在工程中點擊上方工具欄File->New->Target,在選項中選擇Other中的Aggregate,命名最好和工程名有關,我這裏就寫成JRDataModelAggregate。


新建Aggregate

新建好以後,選擇targets列表下的JRDataModelAggregate,點擊build phases,點擊+新建一個New Run Script Phase,把下面的腳本複製到shell下的選項中(腳本來源自網絡,感謝這段腳本的原作者)。有能力的可以根據自己的需要修改下面的腳本。

# 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"${INSTALL_DIR}"


粘貼shell腳本

複製完以後,點擊左上角運行旁邊的target(上圖左上角那個黃色的選項),在下拉的列表中選中我們剛纔創建的JRDataModelAggregate,command+B編譯一下,如果沒什麼意外,等到編譯成功便會彈出我們編譯好的framework了。

四、驗證framework


framework其實可以看做是一個帶擴展名的文件夾,所以我們可以直接進入framework的內部。通過下面的控制檯指令進入到framework中(cd後面是你自己的framework路徑)

cd /Users/ctzxh/Desktop/JRModel/JRDataModel/Products/JRDataModel.framework

執行下面的命令判斷當前framework支持的架構

lipo -info JRDataModel


完成驗證

Tips1:

對於上面的每種處理器架構對應的設備請自行百度。這裏說明一下,如果讓你的包可以支持armv7s的架構(這裏說的支持指的是針對這種架構的優化),可以根據下圖的方式添加,新版的xcode默認便沒有加上armv7s的架構,由於處理器向下兼容,所以即使不添加,所使用包的工程也是可以在armv7s架構上的機器運行的。個人推薦還是不必考慮了,按照官方的來就可以了。添加完以後在驗證包的時候會多顯示一個armv7s。


添加armv7s架構

Tips2:

上面用Aggregate製作的庫是拖入到使用的工程是直接可以使用的,但是之前分別製作的庫直接拖入是不能使用的,解決的方式有兩種:

第一種:製作鏈接庫的時候,選擇生成靜態庫


第二種:在使用動態鏈接庫的時候嵌入二進制庫,在下面的選項中添加要導入的動態庫


網上有種方式是把framework的屬性從required變成Optional,親測行不通,能導入但是不能用。。。

就到這兒吧~~~



文/紀小衰(簡書作者)
原文鏈接:http://www.jianshu.com/p/04a7e28f11b9
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章