iOS打包SDK生成Framework

最近打包了一個SDK,記錄一下~

創建Framework

1、創建工程

image

2、配置環境

Build Setting -> Dead Code Stripping 改爲NO

Build Setting -> Mach-O Type改爲 Static Library

Build Setting -> Build Active Architecture Only 改爲 NO

Build Setting -> Architectures 添加armv7s架構

Build Setting -> Other C flags 添加-fembed-bitcode (使SDK支持bitcode)

Build Phases -> Headers 將公開的頭文件從Project中拖入Public

3、暴露出想要被引用的頭文件,需要暴露的頭文件都拖到public下面,不需要的都放在private或者project下面

image

4、配置腳本保證模擬器真機都能使用 Build Phases -> Run Script 點擊+號,添加一個Run Script,

if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework


if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi

++_前面一大部分是申明一些目錄路徑,最後使用lipo命令進行合併操作。
在修改這個代碼過程中,也許要學習下Xcode的全局變量,代碼中那些${}值,都是Xcode自帶的變量,詳情請參考:Xcode環境變量_++

5、找到工程中Products 文件夾,右鍵show in finder,目標文件即爲合併之後的Framework

image

++可以驗證一下:打開終端:輸入: lipo -info 然後把生成的framework下的二進制文件拖入終端,獲得路徑,回車,得到我們想要的信息:++
得到的framework支持的架構如下:
image

真機架構:armv7 arm64

模擬器架構:x86_64

6、集成過程

出現selector not recognized問題,解決方法:

Build Setting -> Other Linker Flags -> -ObjC
它的作用就是將靜態庫中所有的和對象相關的文件都加載進來。

64位的Mac系統或者iOS系統下,鏈接器有一個bug,會導致只包含有類別的靜態庫無法使用-ObjC標誌來加載文件。變通方法是使用-all_load 或者-force_load標誌,它們的作用都是加載靜態庫中所有文件,不過all_load作用於所有的庫,而-force_load後面必須要指定具體的文件,他們加載的位置也是在Xcode的Build Settings下Other Linker Flags裏面
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章