[iOS]iOS如何进行SDK开发(入门)
2020-04-16 本文已影响0人
沵可安好
前言
兴趣来潮突然想试试如何开发一个自己的SDK,因为之前面试有问到,顺便做个笔记。
什么是SDK开发?
日常开发中,我们会遇到某些情况不能提供源码,项目组件化等需求,这时候我们就可以使用SDK开发,在OC的开发中,我们涉及到的一般是静态库(.a)或者动态库(.framework)。(注:不是所有的.framework就一定是动态库)
a与.framework有什么区别?
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
建议用.framework.
接下来将以实例帮助大家创建一个自己的.framework
首先新建Project选择Framework
![](https://img.haomeiwen.com/i12673226/5e0b3cd8808fdf48.png)
在目录下写入想要封装的类文件
![](https://img.haomeiwen.com/i12673226/afa25b5e780cbb2f.png)
例如我在MyStringUtil中写了一个测试方法:
#import "MyStringUtil.h"
@implementation MyStringUtil
+ (void)helloWorld {
NSLog(@"Hello World!");
}
@end
接下来进行项目配置:
![](https://img.haomeiwen.com/i12673226/fbbc85352aa0667d.png)
然后设置需要暴露的头文件
![](https://img.haomeiwen.com/i12673226/9d28df861596abdd.png)
在主文件中引入头文件
![](https://img.haomeiwen.com/i12673226/41cc4fd6dfe0f100.png)
然后在Xcode中添加执行脚本
![](https://img.haomeiwen.com/i12673226/0db78109dc79d7e2.png)
Project --> TARGETS --> Build Phases -> + --> New Run Script Phases 添加执行脚本,如下:
# Type a script or drag a script file from your workspace to insert its path.
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 "${DEVICE_DIR}" ] || [ ! -d "${SIMULATOR_DIR}" ]
then
exit 0
fi
# 如果合并包已经存在,则替换
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 使用lipo命令将其合并成一个通用framework
# 最后将生成的通用framework放置在工程根目录下新建的Products目录下
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打开目录
open "${SRCROOT}/Products"
fi
最后真机和模拟器各运行一次项目就可以得到framework文件啦。
![](https://img.haomeiwen.com/i12673226/dd7f081605afe506.png)
注意: 只有在真机,模拟器各编译一次后,才会在工程/Products目录下生产合并包,如不希望自动打开目录,注释掉最后一句#open "${SRCROOT}/Products"即可。
接下来使用以下试试
将SDK拖入工程试一试
![](https://img.haomeiwen.com/i12673226/9d0d1b141fe697a5.png)
![](https://img.haomeiwen.com/i12673226/74dc8db8653e2cfe.png)
![](https://img.haomeiwen.com/i12673226/0078f0b03b13ec46.png)