IOS開發有些時候通過制作SDK進行組件化, 封裝化開發很方便, 那么怎么制作一個可用的SDK呢? 直接上干貨
當前環境:
MacOS 12.3.1
Xcode13.4.1
Intel Core i9
xcode
→ File
→ New
→ Project
Frame & Library
→ Framework
→ Next
Product Name
中填寫SDK名字 → Next
之后選個自己能找的到的地方保存工程
創建好了最終是這個樣子
先修改Deployment info
部署信息, 這個要根據自己的目標工程
配置。例如 我加入的目標工程支持到 ios10.0, 不支持iPad, Mac, 那么我創建的SDK也要對應修改
圖片中測試項目是 IOS面試題(設計模式相關) --- 工廠設計模式一個demo , 評論區有對應Demo地址,
其實自己隨便一個項目加進去即可, 留意下版本號對應即可
接下來 Command + N
創建一個類便于后面調用
例如我這邊創建一個SpriteFactory
類, 類型是NSObject
, 并寫入一個實例方法factoryProductSprite
建好之后, 在公共文件ProductSprite.h
(第一個, 你自己建的那個名字), 引入頭文件. 留意下引入文件格式即可
接下來我們需要修改一下Build Settings
中部分內容
-
Targets
→Build Settings
→Mach-O Type
為Static Library
靜態庫 (動態庫有點區別, 方法在最下面)
-
Targets
→Build Settings
→Build Active Architecture Only
僅構建活躍體系為No
修改 Build Active Architecture Only -
Build Settings
→Enable Bitcode
啟用位代碼為No
修改 Enable Bitcode -
Build Phases
→Headers
測試頭文件需要移動到Public
移動前
-
Edit Scheme
→Run
→Info
→Build Configuration
為Release
Build Configuration
接下來我們建立個組群, 管理下SDK
-
Targets
點擊+
→Other
→Aggregate
老版本位置不一樣的, 需要留意下
管理SDK
建完之后如下, 多了一個這個
添加framework
的腳本文件, Build Phases
點擊 +
選擇New Run Script Phase
之后會這樣
把這個復制進去
#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"
#創建輸出目錄,并刪除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
#分別編譯模擬器和真機的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
#拷貝framework到univer目錄
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
lipo "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" -remove arm64 -output "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}"
#合并framework,輸出最終的framework到build目錄
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
#刪除編譯之后生成的無關的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判斷build文件夾是否存在,存在則刪除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打開合并后的文件夾
open "${UNIVERSAL_OUTPUT_FOLDER}"
上方選擇新加的Targets
選擇Any iOS Device
運行
由于我們剛才已經寫腳本了, 所以會自動生成模擬器真機的SDK, 并且自動彈開, 如下
其他項目如果想使用, 把.framework
拖進去或者復制項目再add
進去即可
加入之后如下, 留意下General
中Frameworks, Libraries, and Embedded Content
這快, 如果沒有(老版本), 需要手動加進去.framework
在合適地方調用, 引用頭文件格式 #import "ProductSprite/ProductSprite.h"
, 下面寫進去對應方法
運行可看到
動態庫如果正常按上面方式處理會報錯, 例如
Targets
→ Build Settings
→ Mach-O Type
為Dynamic Library
運行時候會這樣Crash
目標文件: Build Phases
點擊+
, 選擇New Copy File Phase
點擊+
, 選擇對應動態庫加進去, Destination
留意選擇Frameworks
修改Targets
→ Build Settings
→ Build Options
→ Validate Workspace
為Yes
-
Validate Workspace
-Yes
: 那么在構建版本的過程中將對工作區配置進行驗證檢查。
配置完之后再運行, 正常打印