IOS SDK制作

IOS開發有些時候通過制作SDK進行組件化, 封裝化開發很方便, 那么怎么制作一個可用的SDK呢? 直接上干貨

當前環境:
MacOS 12.3.1
Xcode13.4.1
Intel Core i9

xcodeFileNewProject

創建

Frame & LibraryFrameworkNext

創建Framework

Product Name 中填寫SDK名字 → Next 之后選個自己能找的到的地方保存工程

填寫項目名字

創建好了最終是這個樣子


項目初始

先修改Deployment info部署信息, 這個要根據自己的目標工程配置。例如 我加入的目標工程支持到 ios10.0, 不支持iPad, Mac, 那么我創建的SDK也要對應修改

目標工程

圖片中測試項目是 IOS面試題(設計模式相關) --- 工廠設計模式一個demo , 評論區有對應Demo地址,

其實自己隨便一個項目加進去即可, 留意下版本號對應即可

修改 Deployment info
修改 Deployment info

接下來 Command + N創建一個類便于后面調用

創建類

例如我這邊創建一個SpriteFactory類, 類型是NSObject, 并寫入一個實例方法factoryProductSprite

例子
例子

建好之后, 在公共文件ProductSprite.h(第一個, 你自己建的那個名字), 引入頭文件. 留意下引入文件格式即可

引入頭文件

接下來我們需要修改一下Build Settings中部分內容

  • TargetsBuild SettingsMach-O TypeStatic Library靜態庫 (動態庫有點區別, 方法在最下面)
修改 Mach-O Type
  • TargetsBuild SettingsBuild Active Architecture Only 僅構建活躍體系為No

    修改 Build Active Architecture Only

  • Build SettingsEnable Bitcode 啟用位代碼為 No

    修改 Enable Bitcode

  • Build PhasesHeaders 測試頭文件需要移動到Public

    移動前

移動后
  • Edit SchemeRunInfoBuild ConfigurationRelease
    Build Configuration
Release

接下來我們建立個組群, 管理下SDK

  • Targets 點擊+OtherAggregate 老版本位置不一樣的, 需要留意下
    管理SDK
建立Aggregate

建完之后如下, 多了一個這個


建完Aggregate

添加framework的腳本文件, Build Phases 點擊 + 選擇New Run Script Phase

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運行

image.png

由于我們剛才已經寫腳本了, 所以會自動生成模擬器真機的SDK, 并且自動彈開, 如下


image.png

其他項目如果想使用, 把.framework拖進去或者復制項目再add進去即可

加入SDK

加入之后如下, 留意下GeneralFrameworks, Libraries, and Embedded Content這快, 如果沒有(老版本), 需要手動加進去.framework

加入

在合適地方調用, 引用頭文件格式 #import "ProductSprite/ProductSprite.h", 下面寫進去對應方法

調用framework

運行可看到


運行結果



動態庫如果正常按上面方式處理會報錯, 例如
TargetsBuild SettingsMach-O TypeDynamic Library

配置Dynamic Library

運行時候會這樣Crash


動態庫crash

目標文件: Build Phases點擊+, 選擇New Copy File Phase

New Copy File Phase

點擊+, 選擇對應動態庫加進去, Destination 留意選擇Frameworks

配置Copy File

修改TargetsBuild SettingsBuild OptionsValidate WorkspaceYes

image.png

  • Validate Workspace - Yes: 那么在構建版本的過程中將對工作區配置進行驗證檢查。

配置完之后再運行, 正常打印


運行結果
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容