最近打包了一個SDK,記錄一下~
創建Framework
1、創建工程
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下面
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
++可以驗證一下:打開終端:輸入: lipo -info 然後把生成的framework下的二進制文件拖入終端,獲得路徑,回車,得到我們想要的信息:++
得到的framework支持的架構如下:
真機架構: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裏面