1. 程式人生 > >iOS開發:自定義framework並打包

iOS開發:自定義framework並打包

文/CveniEs(簡書作者)
原文連結:http://www.jianshu.com/p/305b716df620
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

關於打包製作屬於自己的framework


 首先宣告一下,我是一個菜鳥,只是在工作中需要給別的公司提供SDK所以學習瞭如何去打包生成屬於自己的SDK,有什麼不足的地方,還希望大家能夠指正.

好了,廢話不多說,首先,我使用的Xcode版本是7.2,新建一個工程,在進入頁面之後,選擇Framework & Libray 選項中的 Cocoa Touch Framework.

 因為要打包所需的檔案,所以這裡我自己建立了CveniEs.h,CveniEs.m檔案,並且自定義了一個初始化方法,在,初始化方法中呼叫了 - (void)getString:(NSString *)string方法,並且列印了一句話,為了證明生成framework之後確實走了該方法;在實際工作過程中,直接把需要打包的所有檔案拖到該工程中即可,

然後選中Target,選中Build Phases -> Headers,可以看出有三個選項,分別是Public,Private,Project;把需要暴露給別人的.h檔案拖到Public中,剩下的不要暴露的,即為隱藏的檔案,放在Project中,


完成上述步驟之後,在littleCveniEs.h檔案中,把所有需要暴露的.h檔案都用#import <littleCveniEs/PublicHeader.h>引入,記住一定要將所有的需要暴露的.h檔案都寫在給定位置,不然編譯後生成的.framework在引用的時候會有警告;

新建一個Target,選擇Other - >Aggregate,重新命名,PS:圖中的標記太過於醜陋,可以忽略, - -!



選中新建的Target,點選Build Pharas ,選中左上角的+,New Run Script Phase;


點開Run Script,新增如下的指令碼;


指令碼內容

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


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



 我們已經完成了所有的工作,可以選擇Command + B,不過編譯之前,按照下圖選擇正確的Target,編譯完成後會自動彈出已經建立完成的.framework;


到這裡,我們已經完成了百分之九十九的步驟了,匯入自己建立的.framework可以實現方法的呼叫,不過,如果你需要隱藏的檔案中含有通過Category建立的類,當你執行程式的時候會發現出現崩潰的現象,如下圖,我在建立自己的.framework的時候隨便寫了一個NSString的Category,並且在初始化方法中呼叫了Category中的方法,程式直接出現了Unrecognized selector sent to instance 0x10008c098的錯誤,這時我們需要在引用我們.framework的工程中設定 Build Pharse -> Other Linker Flags中加上 -all_load 就OK了,再次執行工程,可以完成所有的列印過程.




 最後一張圖是輸出結果,可以看出所有我想要的列印都生成了,我們的.framework也完成了.在製作SDK,生成.framework的過程中,我遇到了上面的問題,查閱了網上的關於製作.framework的文章或者部落格,都沒有把所有的問題集中,或者就Xcode版本過低,這裡我把自己遇到的所有的問題都羅列了出來,並且給出了相應的解決方法,大家可以參考一下,如果有大牛發現我哪裡寫的有問題,還請指正出來.我會努力改正,做的更好.