前言
前面的兩遍文章分別介紹了制作真機上面的靜態庫和動態庫,但是問題又來了,真機上面的庫是不能在模擬器上面運行的,是直接編譯不過的,那么有沒有一種辦法,既可以在真機上面運行也能在模擬器上面運行?那我可以肯定的告訴你,是絕對可以的。下面我就帶你一步一步的制作。? 制作真機上面的靜態庫? 制作真機上面的動態庫
制作通用靜態庫
在我制作真機上面的靜態庫的基礎上,我這邊新建了一個StaticLibrary來演示制作。
在之前的基礎上分別選擇真機和模擬器運行,然后Show in Finder 以此生成兩種類型的.a文件。如下截圖
接下來就是:合并模擬器(release-iphonesimulator)和真機(release-iphoneos)下的.a,以便支持真機和模擬器,合并后的.a大小大約是不合并的2倍左右。
首先我新建一個文件夾,命名為SDK,將上截圖中的 Debug-iphoneos 和 Debug-iphonesimulator文件拷貝進SDK文件夾中,然后打開終端應用,準備執行如下命令
一、在終端輸入:lipo? -create? ? ?
二、將debug-iphonesimulator下的.a拖進終端,打個空格
三、繼續將debug-iphoneos 下.a 拖進終端,打個空格
四、繼續輸入:-output ,打個空格
五、輸入合并后的.a所要放的文件路徑,并且命名.a文件(我這里是Static.a),最后回車
最終的命令如下:
lipo? -create? /Users/lengqiuhui/Desktop/SDK/Debug-iphonesimulator/libStaticLibrary.a? /Users/lengqiuhui/Desktop/SDK/Debug-iphoneos/libStaticLibrary.a? -output? /Users/lengqiuhui/Desktop/Value/Static.a? 回車
截圖如下:
PS:我這里的 /Users/lengqiuhui/Desktop/SDK/Debug-iphonesimulator/libStaticLibrary.a 是模擬器.a文件在本機的路徑
/Users/lengqiuhui/Desktop/SDK/Debug-iphoneos/libStaticLibrary.a 是真機.a文件在本機的路徑? /Users/lengqiuhui/Desktop/Value是生成最終合并的文件路徑,Static.a 是合并后的.a文件名字
合并后的最終的結果如下:
最后檢查合并后的Static.a文件是不是滿足所有要求,依然在終端進行以下操作:
一、在終端輸入:lipo? -info?
二、將合并后的.a拖進終端 ,回車
最終的命名如下:lipo-info? /Users/lengqiuhui/Desktop/Value/Static.a? 回車
從終端信息可以看出:只支持 i386 和 arm64 處理器的指令集,
最后只需要將制作的 Static.a 文件和之前漏出的頭文件放入到項目中既可,再也不用擔心源碼暴漏或別人隨意修改你的代碼了,不過如果有圖片資源,圖片資源是不能打進.a的,需要在外面添加的哦。
最終效果如下截圖:
模擬器:
真機:
制作通用動態庫
在我制作真機上面的動態庫的基礎上,首先新建一個Aggregate Target? 我這里命名為:GeneralWithDynamic。 File——New——Target——Cross-platform——Aggregate? 如下截圖
添加script到新建的Target,然后在script中添加如下信息
# 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}"
添加信息之后,點擊運行剛剛新建的GeneralWithDynamic,如果沒有異常的話,會自動彈出生成的Framework文件, 然后查看Framework支持哪些架構,在終端輸入:lipo? -info? 然后將生成后的Framework拖進終端 ,回車(和上面查看靜態庫支持哪些架構是一樣的),最后將這個Framework添加到項目中運行即可,如下截圖