IOS 静态库打包流程简化详细介绍
发布时间 - 2026-01-10 22:03:04 点击率:次IOS 静态库打包流程简化

在iOS开发中,我们经常会遇到开发SDK的需求。开发好的静态库后需要手动的合并
.a文件,然后再拷贝相关的头文件,接着把静态库和头文件放在同一个文件里面打包发送给SDK的使用者。本文将介绍如何使用脚本,简化这一连串的过程。为了照顾广大初学者,教程将会详细介绍打包的基本流程。
关于静态库和动态库区别,可以看我的另外一篇文章: iOS静态库和Framework区别
项目配置
新建一个名为TestSDK的静态库工程
然后点击Target下边的加号按钮,添加新的Target
选择Cross-platform,新建一个Aggregate,命名为TestSDKShell
可以看到TARGETS目录下多了一个新的Target。
点击TARGETS->TestSDKShell->Build Phases->+->New Run Script Phases
然后新建一个Shell文件,命名为build_TestSDK_script.sh
添加Shell文件后的工程如下
然后把shell文件的目录写到刚才所建立的Run Script Phases里面。
编码完成后设置我们需要暴露出来的头文件,把需要暴露出来的头文件添加到Copy Files
最后把博客最后的shell代码拷贝到build_TestSDK_script.sh文件下,运行TestSDKShell即可完成自动打包。
这里可能存在的问题就是脚本没有运行的权限,在终端中切换到build_TestSDK_script.sh所在目录,使用
sudo chmod +x build_TestSDK_script.sh
对shell文件进行授权,再次运行即可。运行成功后,即可看到包打好了。文件的命名包括静态库名字,日期,Git版本(我这里还没提交过代码,所以Git版本获取不到),Debug/Release版本。
简化流程分析
开始编写脚本简化步骤,我们首先需要明确SDK需要注意的以下几点:
- 需要支持所有位数的设备,
arm64 armv7 armv7s - 需要可以配置Debug和Release版本
- 需要支持模拟器和真机
第一点我们需要注意的是配置文件里面的Build Active Architecture Only。
这个配置的作用是开发者可以设置Xcode,仅编译生成满足当前插入的设备的处理器二进制文件。当前插入设备就是你正在用于调试的机器。在日常开发中为了提高编译的速度,我们可以把Debug模式下的设置为YES,但是Release模式下必须设置为NO,否则打包上线的文件可能就会出问题了。
在开发SDK的时候,我们把所有的都设置为NO,这样打包出来的文件就不会出问题了。
为了让脚本可以适配Debug和Relaese模式。我们使用Xcode自带的配置变量${CONFIGURATION}。在打包的时候,使用该变量即可。
打包时候修改这里决定是打什么版本
打包模拟器静态库
#编译模拟器库文件
xcodebuild build -project ${PROJ} \
-scheme ${LIB_STATIC_NAME} \
-configuration ${CONFIGURATION} \
-sdk iphonesimulator \
clean \
build \
CONFIGURATION_BUILD_DIR=${IPHONE_SIMULATOR_DIR}
打包真机库文件
#编译真机库文件
xcodebuild -project ${PROJ} \
-scheme ${LIB_STATIC_NAME} \
-configuration ${CONFIGURATION} \
-sdk iphoneos \
clean \
build \
CONFIGURATION_BUILD_DIR=${IPHONE_OS_DIR}
最后是把两个库文件合在一起
# 静态库文件
LIB_NAME=lib${LIB_STATIC_NAME}.a
#合并模拟器文件和真机文件
lipo -create ${IPHONE_OS_DIR}/${LIB_NAME} ${IPHONE_SIMULATOR_DIR}/${LIB_NAME} -output ${TEMP_DIR}/${LIB_NAME}
lipo -info ${LIB_NAME}
这样就完成了基本的编译合并工作,但是对于一个很懒的程序员来说,这还不够,这样我还需要把头文件合.a文件分别拷贝出来,然后放到一个目录下面。那就继续写脚本,让脚本完成吧。
#拷贝头文件和.a文件到同一目录下
##建立SDK目录
pushd ${TEMP_DIR}
if [[ -d ${LIB_STATIC_NAME} ]]; then
rm -fR ${LIB_STATIC_NAME}
fi
mkdir -p ${LIB_STATIC_NAME}
##拷贝.a和头文件
cp -fR ${LIB_NAME} ${LIB_STATIC_NAME}
rm -fR ${LIB_NAME}
cp -f ${IPHONE_SIMULATOR_DIR}/include/${LIB_STATIC_NAME}/* ${LIB_STATIC_NAME}
虽然放到了同一个文件夹,可我给使用SDK的用户发放的时候总得使用压缩包。压缩也自动化算了。
#打包为zip文件
PACKAGE_DATE=`date '+%Y%m%d%H'`
GIT_VERSION=`git log --abbrev-commit|head -1|cut -d' ' -f 2`
SDK_ZIP_NAME=iOS_${LIB_STATIC_NAME}_${PACKAGE_DATE}_${GIT_VERSION}_${CONFIGURATION}.zip
zip -qr ${SDK_ZIP_NAME} ${LIB_STATIC_NAME}
当然,你也可以继续写脚本。。。把压缩包自动发送给需要的人。。
脚本完整代码
#!/bin/sh
# build_TestSDK_script.sh
# TestSDK
#
# Created by jianquan on 2016/11/16.
# Copyright © 2016年 JoySeeDog. All rights reserved.
PROJ=${PROJECT_NAME}.xcodeproj
LIB_STATIC_NAME=TestSDK #把项目名改为自己的即可使用
TEMP_DIR=~/XcodeTestTempBuild#打包出来的文件的目录,可以自己定义
IPHONE_OS_DIR=${TEMP_DIR}/${CONFIGURATION}-iphoneos
IPHONE_SIMULATOR_DIR=${TEMP_DIR}/${CONFIGURATION}-iphonesimulator
#创建真机库文件目录
if [[ ! -d ${IPHONE_OS_DIR} ]]; then
mkdir -p ${IPHONE_OS_DIR}
fi
#创建模拟器库文件目录
if [[ ! -d ${IPHONE_SIMULATOR_DIR} ]]; then
mkdir -p ${IPHONE_SIMULATOR_DIR}
fi
#编译真机库文件
xcodebuild -project ${PROJ} \
-scheme ${LIB_STATIC_NAME} \
-configuration ${CONFIGURATION} \
-sdk iphoneos \
clean \
build \
CONFIGURATION_BUILD_DIR=${IPHONE_OS_DIR}
# -archivePath ${IPHONE_OS_DIR}
#编译模拟器库文件
xcodebuild build -project ${PROJ} \
-scheme ${LIB_STATIC_NAME} \
-configuration ${CONFIGURATION} \
-sdk iphonesimulator \
clean \
build \
CONFIGURATION_BUILD_DIR=${IPHONE_SIMULATOR_DIR}
# -archivePath ${IPHONE_SIMULATOR_DIR}
# 静态库文件
LIB_NAME=lib${LIB_STATIC_NAME}.a
#合并模拟器文件和真机文件
lipo -create ${IPHONE_OS_DIR}/${LIB_NAME} ${IPHONE_SIMULATOR_DIR}/${LIB_NAME} -output ${TEMP_DIR}/${LIB_NAME}
lipo -info ${LIB_NAME}
#拷贝头文件和.a文件到同一目录下
##建立SDK目录
pushd ${TEMP_DIR}
if [[ -d ${LIB_STATIC_NAME} ]]; then
rm -fR ${LIB_STATIC_NAME}
fi
mkdir -p ${LIB_STATIC_NAME}
##拷贝.a和头文件
cp -fR ${LIB_NAME} ${LIB_STATIC_NAME}
rm -fR ${LIB_NAME}
cp -f ${IPHONE_SIMULATOR_DIR}/include/${LIB_STATIC_NAME}/* ${LIB_STATIC_NAME}
#打包为zip文件
PACKAGE_DATE=`date '+%Y%m%d%H'`
GIT_VERSION=`git log --abbrev-commit|head -1|cut -d' ' -f 2`
SDK_ZIP_NAME=iOS_${LIB_STATIC_NAME}_${PACKAGE_DATE}_${GIT_VERSION}_${CONFIGURATION}.zip
zip -qr ${SDK_ZIP_NAME} ${LIB_STATIC_NAME}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# IOS
# 静态库打包流程简化
# 静态库打包
# 静态库打包详解
# Python实现iOS自动化打包详解步骤
# iOS中使用Fastlane实现自动化打包和发布
# IOS 打包出现Missing Push Notification Entitlement 问题解决
# iOS中打包上传常见的错误与解决办法
# IOS 打包静态库详细介绍
# 实例分析IOS实现自动打包
# iOS 缩小打包项目ipa大小的实现方法
# Python的iOS自动化打包实例代码
# 头文件
# 设置为
# 新建一个
# 压缩包
# 目录下
# 命名为
# 需要注意
# 自己的
# 的人
# 的是
# 续写
# 发送给
# 这一
# 就会
# 好了
# 还没
# 放在
# 我还
# 那就
# 将会
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
手机网站制作与建设方案,手机网站如何建设?
Android仿QQ列表左滑删除操作
Laravel如何生成API文档?(Swagger/OpenAPI教程)
制作电商网页,电商供应链怎么做?
JavaScript实现Fly Bird小游戏
北京专业网站制作设计师招聘,北京白云观官方网站?
bootstrap日历插件datetimepicker使用方法
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何基于云服务器快速搭建网站及云盘系统?
百度浏览器如何管理插件 百度浏览器插件管理方法
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
EditPlus中的正则表达式实战(6)
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何快速搭建安全的FTP站点?
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
如何快速搭建高效可靠的建站解决方案?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
网站优化排名时,需要考虑哪些问题呢?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何快速重置建站主机并恢复默认配置?
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
如何在阿里云服务器自主搭建网站?
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
,南京靠谱的征婚网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何实现javascript表单验证_正则表达式有哪些实用技巧
如何在云指建站中生成FTP站点?
JS经典正则表达式笔试题汇总
EditPlus中的正则表达式实战(5)
如何确认建站备案号应放置的具体位置?
高性价比服务器租赁——企业级配置与24小时运维服务
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
活动邀请函制作网站有哪些,活动邀请函文案?
LinuxShell函数封装方法_脚本复用设计思路【教程】
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel Session怎么存储_Laravel Session驱动配置详解
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel如何使用withoutEvents方法临时禁用模型事件
Swift中switch语句区间和元组模式匹配
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】

