IOS 静态库打包流程简化详细介绍

 更新时间:2016年12月23日 10:42:32   投稿:lqh  
这篇文章主要介绍了IOS 静态库打包流程简化详细介绍的相关资料,开发好的静态库后需要手动的合并.a文件,然后再拷贝相关的头文件,接着把静态库和头文件放在同一个文件里面打包发送给SDK的使用者,这里简化下流程,需要的朋友可以参考下

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需要注意的以下几点:

  1.     需要支持所有位数的设备,arm64 armv7 armv7s
  2.  需要可以配置Debug和Release版本
  3.     需要支持模拟器和真机

第一点我们需要注意的是配置文件里面的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开发中实现显示gif图片的方法

    iOS开发中实现显示gif图片的方法

    这篇文章主要介绍了iOS开发中实现显示gif图片的方法,代码基于传统的Objective-C,需要的朋友可以参考下
    2015-09-09
  • 浅谈iOS中的锁的介绍及使用

    浅谈iOS中的锁的介绍及使用

    本篇文章主要介绍了浅谈iOS中的锁的介绍及使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Objective-C 入门篇(推荐)

    Objective-C 入门篇(推荐)

    由C语言和Smalltalk扩展出来的,是C语言的超集,最大的区别是OC是面向对象的,其火星文写法对于之前从事Java开发的同学颇感蛋疼,OC最大特点之一是使用消息结构而不是函数调用
    2021-11-11
  • iOS实现单元格折叠

    iOS实现单元格折叠

    这篇文章主要为大家详细介绍了iOS实现单元格折叠,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 详解IOS四种保存数据的方式

    详解IOS四种保存数据的方式

    本篇文章主要介绍了OS四种保存数据的方式,现在分享给大家,也给大家做个参考。感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • iOS 动画实战之钓鱼小游戏实例代码

    iOS 动画实战之钓鱼小游戏实例代码

    最近小编做了一个钓鱼小游戏,平时没有做过,所以上手有点急躁,不过,最终还是实现了,下面小编给大家分享iOS 动画实战之钓鱼小游戏的实现思路,感兴趣的朋友一起看看吧
    2018-02-02
  • iOS Runntime 动态添加类方法并调用-class_addMethod

    iOS Runntime 动态添加类方法并调用-class_addMethod

    这篇文章主要介绍了iOS Runntime 动态添加类方法并调用-class_addMethod的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • IOS 开发APP之关于时间处理详细介绍

    IOS 开发APP之关于时间处理详细介绍

    这篇文章主要介绍了IOS 开发APP之关于时间处理详细介绍的相关资料,开发APP 不仅需要对API的调用还需要对时间相关的各种API之间的差别,再因场景而异去设计相应的机制,需要的朋友可以参考下
    2016-12-12
  • 详解适配iOS10 的相关权限设置

    详解适配iOS10 的相关权限设置

    在最新版本的iOS10系统中,如果你的项目中访问了隐私数据,比如:相机、相册、录音、定位、联系人等等。涉及到权限问题,本篇文章主要介绍了适配iOS10 的相关权限设置,有兴趣的可以了解一下。
    2016-12-12
  • iOS中表单列表样式键盘遮挡的解决方案

    iOS中表单列表样式键盘遮挡的解决方案

    这篇文章主要给大家介绍了关于iOS中表单列表样式键盘遮挡的解决方案,文中通过示例代码将解决的方法一步步介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2019-01-01

最新评论