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 Settings
→Enable Bitcode
启用位代码为No
-
Build Phases
→Headers
测试头文件需要移动到Public
-
Edit Scheme
→Run
→Info
→Build Configuration
为Release
接下来我们建立个组群, 管理下SDK
-
Targets
点击+
→Other
→Aggregate
老版本位置不一样的, 需要留意下
建完之后如下, 多了一个这个
添加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
: 那么在构建版本的过程中将对工作区配置进行验证检查。
配置完之后再运行, 正常打印