时间:2021-05-20
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需要注意的以下几点:
第一点我们需要注意的是配置文件里面的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} ]]; thenrm -fR ${LIB_STATIC_NAME}fimkdir -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}.zipzip -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}.xcodeprojLIB_STATIC_NAME=TestSDK #把项目名改为自己的即可使用TEMP_DIR=~/XcodeTestTempBuild#打包出来的文件的目录,可以自己定义IPHONE_OS_DIR=${TEMP_DIR}/${CONFIGURATION}-iphoneosIPHONE_SIMULATOR_DIR=${TEMP_DIR}/${CONFIGURATION}-iphonesimulator#创建真机库文件目录if [[ ! -d ${IPHONE_OS_DIR} ]]; thenmkdir -p ${IPHONE_OS_DIR}fi#创建模拟器库文件目录if [[ ! -d ${IPHONE_SIMULATOR_DIR} ]]; thenmkdir -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} ]]; thenrm -fR ${LIB_STATIC_NAME}fimkdir -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}.zipzip -qr ${SDK_ZIP_NAME} ${LIB_STATIC_NAME}感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
IOS打包静态库详细介绍一、前言前段时间看的一本书上说:“隔着一段距离看,很多有趣的知识看起来都很唬人。”比如说这篇我要总结的“静态库知识”,在我初出茅庐的时候
使用场景已搭建了PyPI私有库,上传公共库包含静态文件,如需要使用sql静态文件初始化数据库。打包python包,给其他人使用,但项目中包含静态文件,如html
IOS静态库和Framework区别一、什么是库?库是共享程序代码的方式,一般分为静态库和动态库。二、静态库与动态库的区别?静态库:链接时完整地拷贝至可执行文件
静态库与动态库的创建与使用1.基本概念静态库:链接时,库与编译生成的.o文件一起打包到可执行文件中。linux/windows下扩展名分别为:.a/.lib动态
最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework。在Xcode上没有找到允许编译,如同Android上的