iOS分享的demo移动开发进阶程序员

iOS开发之.a静态库制作

2016-12-08  本文已影响213人  lsif的简书

简单介绍图片、界面xib等资源文件封装到.a静态库,用Xcode 8.1 制作为例

一、首先将资源文件打包成bundle

借助于OS X,因为iOS框架中没有创建Bundle的模板

imageBundle.png

删除工程中多余的文件

delete.png

由于删除了plist文件,所以必须在Build Settings中删除对它的引用

deleteplist.png

我们创建项目时选的是OS X中的框架,所以此处需要修改Base SDK为iOS

AlterBaseSdk.png

设置完后,可以把我们需要的资源拷贝过来

copyimage.png

按快捷键"Command + B"编译,编译成功后,Products下面的PictureOCRImage.bundle由红色变成了黑色,表示编译成功

编译.png

可以通过右击 Show in Finder -> 查看文件夹 ->右击显示包内容,查看里面的内容

► 至此,资源打包成bundle完成.如果只是普通的资源,完全可以创建一个文件夹,把需要封装的资源文件拷贝至该目录下,将其改成后缀名为bundle即可,然后就可以使用NSBundle提供的接口访问其内部的资源文件,当然,也可以通过访问普通文件目录的方法访问其内部的资源。这样写主要是考虑到xib文件打包

制作.a文件库

新建项目,点击iOS—Framework&—Cocoa Touch Static Library。

创建工程.png

系统自动生成以工程名命名的.h和.m文件,可自定义的在目录下添加或删除文件,注意目录下Products文件夹有一个.a文件为红色,说明文件并不存在。这里我们将系统生成的.h和.m文件删除。

工程文件.png

将需要打包的文件添加到工程中

添加文件.png

点击Build Phases—Copy Files,左下角点击+号按钮,添加你需要暴露的接口头文件。

暴露的文件接头.png

点击左上角,选择Edit Scheme,Build Configuration下选择Release,先注意检查下面Release是否为NO:Yes表示只编译选中模拟器设备对应的架构,No则为编译所有模拟器设备支持的cup架构(Debug版本同理),选择NO,然后分别在模拟器和真机下Command+B编译一下,会看到Products文件夹下的.a文件变为黑色,这个.a文件就是我们想要得到的静态库。

release设置.png

可以通过右击 Show in Finder -> 查看文件夹,打开Build—Products文件夹,会看到Release-iphoneos和Release-iphonesimulator文件夹,分别是真机和模拟器的.a文件,为了使用方便我们将两个版本的.a文件合并。

a.终端合成

合并.png 合并1.png

b.使用脚本合成真机和模拟器的.a文件

  1. 选中TARGETS 点击左下角的加号
添加 shell.png

2)选中TARGETS中新创建的脚本工程,点击左上角的"+"号,选中"New Run Script Phase"

New Run Script Phase.png

3)复制脚本代码,将下面代码复制到图中指示的地方

if [ "${ACTION}" = "build" ]
then



#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"


#build之后的文件夹路径
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真机build生成的头文件的文件夹路径
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真机build生成的.a文件路径
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模拟器build生成的.a文件路径
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"


#目标文件夹路径
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"

#目标头文件文件夹路径
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目标.a路径
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"


#判断build文件夹是否存在,存在则删除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#创建目标文件夹
mkdir -p "${INSTALL_DIR}"


#build之前clean一下
xcodebuild -target ${target_Name} clean

#模拟器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真机build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

#复制头文件到目标文件夹
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模拟器和真机.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打开目标文件夹
open "${INSTALL_DIR}"


fi
复制代码.png
  1. 选中脚本工程运行
选中脚本成功.png

查看静态库.a对处理器架构的支持,

先cd到.a文件的路径下,命令行输入:lipo -info xxxxx.a

239BE0C3-B5D9-4F01-8134-93A28B55589A.png

模拟器:iphone4s~5 : i386 iphone5s~6plus : x86_64
真机:iphone3gs~4s : armv7 iphone5~5c : armv7s (静态库只要支持了armv7,就可以跑在armv7s的架构上) iphone5s~6plus : arm64

至此,.a库的制作完成了

参考文章:
http://www.fx114.net/qa-173-100870.aspx http://blog.csdn.net/lvxiangan/article/details/50256963
网上资源虽杂,但也丰富,学习了

上一篇下一篇

猜你喜欢

热点阅读