桥边风满袖
实践出真知,勤奋则必达!

1、SDK库的含义:

共享程序代码的方式,可以对自己的项目进行封装,生成库,方便别人的使用。

 

2、SDK库的分类:

A、静态库,链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

B、动态库链接时不拷贝,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

 

3、SDK库的形式:

A、.a与.framework文件是静态库(.framework属于自己创建)自己创建的.framework是静态库文件。

B、.tbd(Xcode7和iOS9 之前是.dylib文件)与.framework文件是动态库(.framework属于系统自带)系统自带的.framework是动态库文件。

 

4、静态库和动态库的区别:

《1》.a是一个纯二进制文件,不能直接使用,至少要有.h文件配合

《2》.framework中除了有二进制文件之外还有资源文件,可以直接使用。

.framework = .a(二进制文件) + .h (头文件) + resourceFile (资源文件)

 

5、静态库的使用优点:

《1》方便程序共享代码,便于合理规范使用。

《2》 可以实现iOS程序的模块化,可以把固定的业务模块化成静态库。

《3》能够与别人分享你的代码库,但又不想让别人看到你代码如何实现。

《4》开发第三方SDK的业务模块需求。

 

6、静态库的制作的注意点:

《1》.a是二进制文件,需要配合.h头文件和其它文件才能使用,.framework可以直接使用。

《2》图片资源的处理可以使用.bundle文件,.bundle文件的名字和.a或.framework的名字相同。

《3》.bundle文件的简单制作如下:

  首先,新建一个文件夹;

  其次,修改文件夹的后缀名为.bundle ;

  最后,点击右键,打开显示包内容,就可以向其中添加图片资源。

《4》category文件打包成静态库文件再添加到工程,调用分类方法时会有找不到该方法的运行时错误(selector not recognized),解决办法就是在静态库的工程中配置other linker flags的值为-ObjC。

《5》如果静态库很复杂,需要暴露的.h头文件比较多,可以在静态库内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把需要暴露的.h头文件显示,不需要暴露的.h头文件集中放在这个内部创建的.h文件。

 

7、创建.a静态库文件流程如下:

《1》创建一个.a静态库工程

Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Static Library ——》命名项目工程 ——》保存目录

《2》一个静态库工程由头文件和实现文件组成(TestSDK.h和TestSDK.m),这些文件将被编译为库本身。由于不需要实现文件,需要右键单击TestSDK.m删除该文件并移动到废纸篓。

《3》创建一个自己封装的控件,然后拷贝到Xcode项目工程目录里面。注意拷贝的时候,要勾选3个选项,Copy items id needed、 Create groups和TestSDK。

《4》添加控件的.h头文件到库的主头文件TestSDK.h中

《5》生成静态库的形式:

A、模拟器,只有在模拟器才能编译运行

Build only Device ——》show in Finder ——》拿到模拟器的.a二进制文件和其它所有的.h头文件

B、真机,只有在手机端才能编译运行

iOS Simulators ——》show in Finder ——》拿到真机的.a二进制文件和其它所有的.h头文件

《6》合成真机与模拟器.a文件,这样可以在真机和模拟器都能够编译运行,终端命令如下:

lipo -create

模拟器.a文件目录  

真机.a文件目录

-output  输出目录/TestSDk.a, 获取的TestSDk.a文件兼容模拟器和真机的二进制文件。

 

8、创建.framework静态库文件流程如下:

《1》创建一个.framework静态库工程

Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Framework ——》命名项目工程 ——》保存目录

《2》创建两个新的工具类,或者向项目工程拖入一个相对完整的功能模块。

《3》在项目工程中添加所依赖的框架

Xcode ——》Project ——》Targets ——》Build Phases ——》Link Binary With Libraries

《4》在项目工程中设置要暴露的头文件接口,设置Public和Private,选择相应的运行设备。

Xcode ——》Project ——》Targets ——》Build Phases ——》Headers

《5》在项目工程中添加脚本

Xcode ——》Project ——》Targets ——》Build Phases ——》New Run Script Phase ——》 添加shell脚本

加入下面的脚本将模拟器和真机的Framework合并,如下所示:

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

 

then

 

INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

 

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

 

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

 

if [ -d "${INSTALL_DIR}" ]

 

then

 

rm -rf "${INSTALL_DIR}"

 

fi

 

mkdir -p "${INSTALL_DIR}"

 

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

 

#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

 

lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

 

#open "${DEVICE_DIR}"

 

open "${SRCROOT}/Products"

 

fi

 

《6》点击Xcode左上角的运行按钮,然后脚本就自动弹出生成的Framework库文件。

《7》如果其他项目工程导入这个Framework库,编译报错,需要让编译器提前编译这个二进制文件,做法是Xcode->General->Embedded Binaries,将系统依赖的Framework添加上去即可。

《8》最后,Framework的核心在于内部结构的设计,谨慎设计你的每一个接口,在每个对外暴露的方法中需要做好注释,然而一份通用的接口文档也是必须的。

 

posted on 2018-04-24 12:48  桥边风满袖  阅读(463)  评论(0编辑  收藏  举报