iOS SDK的设计与实现

写在前面,本文并不详细描述具体如何创建.a文件, framework,以及如何使用workspace将SDK与测试项目关联方便 SDK单元测试。 因为下文提供的网络资源中都包含在内了。希望小伙伴们自行查阅。下文只讲述一个整体大致流程 和一些个人经验。文中提供的网站都很重要 其中也包含了一些相关的细节描述,这里就不做过多赘述了。跟着本文 相信一定可以搭建好自己的框架的。个人推荐使用framework
至于为什么,这里买个丸子。。。对 就是丸子。。。下面的资料中有讲到的。goodluck!

1.SDK的设计

这里推荐一本书中的部分内容《Effective Objective-C 2.0》第三章 接口与API设计,当然,本书的其他内容也很重要。下面附上思维导图
这里写图片描述

当然,书中的设计模式方面的内容貌似是没有的,或者说很少,对设计模式感兴趣的小伙伴 推荐看这位大神总结的设计模式方面的文章:
设计模式 http://blog.csdn.net/lovelion/article/details/17517213

还有 《Head First 设计模式》 也是很好的选择

2.SDK架构,大致如图

仅供参考

每个项目都会根据自己的需求来搭建项目框架,SDK也如此。具体情况具体分析。目的只是为了让项目更好维护

3.注意事项

1.尽量不要在SDK中使用分类[这样的话 开发者接入SDK时 可以少一步配置]
在SDK中不要使用分类,使用分类需要注意很多情况:例如分类实现的是类方法 还是对象方法, 在调用分类方法的时候 的外部方法体是类方法还是对象方法等。。。
如果SDK中有分类在生成静态库的时候貌似不会被加载进去[这个有待考证] 需要外接再次提供分类文件。。。
综上:暂时不要在SDK中使用分类方法 2017-08-31 PM

在制作framework或者lib的时候,如果使用了category, 把category打包成静态库是没有问题的,但是在用这个静态库的工程中,
调用category中的方法时会有找不到该方法的【运行时】错误(selector not recognized),
解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC

生成静态库 .a文件

1.生成静态库 可参考:http://www.jianshu.com/p/234601f56e16

在编译真机 生成静态库的时候 记得勾选上 Building Setting ->Build Active Architecture Only 为NO 不然编译的静态库只会生成当前编译的真机对应的支持库
这样在外部引用的时候 如果用其他型号的真机编译就会报错了

Build Active Architecture Only
设置为NO的时候,会编译支持的所有的版本
设置为YES的时候,是为Debug的时候速度更快,它只编译当前的architecture 版本

需要生成 模拟器下的.a文件 和 真机环境下的 .a文件 然后将两个文件合并,这样就可以在真机和模拟器环境下使用该静态库了

1.lipo -create 静态库1路径 静态库2路径 -output 合并的静态库

2.将生成的头文件中不需要的部分删除掉
3.将头文件中不需要的接口删除掉
4.当然前提是demo能正常运行
注意:demo里面的头文件内容和压缩包里的内容要一致

使用静态库的方法:
1.将静态库添加到工程中
2.将头文件添加到工程中 即可使用


生成Framework

基础部分[推荐直接使用.framework]
http://blog.csdn.net/lvxiangan/article/details/43115131 .a与framework的区别 以及开发SDK的一些注意事项

实践部分
http://www.jianshu.com/p/5b5238b2dbb9 iOS如何生成.a文件
http://www.jianshu.com/p/87dbf57cfe4a iOS如何生成framework 以及一些注意事项【好文】

我们可以把SDK和一个测试项目绑定在一次 这样方便我们测试SDK 还能够debug看到SDK的源代码
http://www.jianshu.com/p/a488399a14cd iOS建一个framework和frameworkTest项目在workspace中

上面网页资源中搞得脚本存在错误,下面给出正确脚本

脚本 from 逗逼大神
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

生成API文档

生成API文档[appledoc] 安装 appledoc 可参考:http://www.jianshu.com/p/65f1afdb9445

1.在需要生成文档的类中编写满足appledoc的注释
2.将需要生成文档的类放在某个文件夹下,然后cd到此路径 执行命令行 即可生成API文档

详细: 生成文档的命令 将下面的内容直接复制到终端回车即可

appledoc –no-create-docset –output ./doc –project-name “SmartDevice” –company-id “XXX有限公司” –project-company “XXX有限公司” ./

这里的 ./doc :生成文档后的路径

注意:appledoc 命令也会去查看.m文件,所以只需要将 需要生成文档的.h文件放在一起 执行命令即可

一下是需要生成文档的类

M2MENUM.h

Device文件夹下的所有头文件

Controller文件下的 所有控制器类我头文件

appledoc 的格式 from http://www.cocoachina.com/ios/20161125/18183.html

/// 这是单行注释。
/** 这也是单行注释 */
/*! 同样是单行注释 */
/** 这也是单行注释,
*  第二行会接上第一行。
*/
/** 第一行是类的简介
在简介的下面,就是类的详细介绍了。
没有间隔换行会被消除,就像Html那样。
下面是常用的markdown语法
- - -
无序列表: (每行以 '*'、'-'、'+' 开头):
* this is the first line
* this is the second line
* this is the third line
有序列表: (每行以 1.2.3、a.b.c 开头):
a. this is the first line
b. this is the secode line
多级列表:
* this is the first line
a. this is line a
b. this is line b
* this is the second line
1. this in line 1
2. this is line 2
标题:
# This is an H1
## This is an H2
### This is an H3
#### This is an h4
##### This is an h5
###### This is an H6
链接:
普通URL直接写上,appledoc会自动翻译成链接: http://    blog.ibireme.com
[这个](http://example.net/) 链接会隐藏实际URL.
表格:
| header1 | header2 | header3 |
|---------|:-------:|--------:|
| normal  |  center |  right  |
| cell    | cell    | cell    |
引用:
这里会引用到方法 `someMethod:`,这里会引用到类 `YYColor`
这里会引用到一个代码块
void CMYK2RGB(float c, float m, float y, float k,
float *r, float *g, float *b) {
*r = (1 - c) * (1 - k);
*g = (1 - m) * (1 - k);
*b = (1 - y) * (1 - k);
}
@since iOS5.0
*/
@interface AppledocExample : NSObject
///这里是属性的说明
@property (nonatomic, strong) NSString *name;
/**
@brief 这里是方法的简介。该Tag不能放到类注释里。
@exception UIColorException 这里是方法抛出异常的说明
@see YYColor
@see someMethod:
@warning 这里是警告,会显示成蓝色的框框
@bug 这里是bug,会显示成黄色的框框
@param red   这里是参数说明1
@param green 这里是参数说明2
@param blue  这里是参数说明3
@return  这里是返回值说明
*/
- (UIColor *)initWithRed:(int)red green:(int)green blue:(int)blue;

生成文档如下图所示
SDK层次结构图

总览

API详细信息


蓝牙相关

BLE 入门: http://www.jianshu.com/p/c9b20fe17600
BLE 第一章 http://www.jianshu.com/p/760f042a1d81
BLE 第二~六章: http://www.jianshu.com/u/3f8e2a3945de


引用第三方库
下列情况只在使用.a文件的时候遇到过,使用framework文件时 并未遇到。建议使用framework封装自己的SDK

1.可以在静态库中引用第三方库,不必暴露头文件在静态库中。当外界使用到静态库时,涉及到第三方库的接口在调用时 外部项目需要导入对应的第三方库
例如:本静态库中当使用到涉及到网络请求时,需要在外部工程中添加AFN库,如果没有添加,会报错 提示 缺少对应的AFNXXX等信息

最终效果图
外部项目导入后的样子

猜你喜欢

转载自blog.csdn.net/wokenshin/article/details/77968688