iOS SDK的设计与实现

2017-09-13 20:46:10来源:CSDN作者:wokenshin人点击

分享

写在前面,本文并不详细描述具体如何创建.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=buildDEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.frameworkSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework# -configuration ${CONFIGURATION}# Clean and Building both architectures.xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean buildxcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build# Cleaning the oldest.if [ -d "${INSTALL_DIR}" ]thenrm -rf "${INSTALL_DIR}"fimkdir -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.hDevice文件夹下的所有头文件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 lineb. this is the secode line多级列表:* this is the first linea. this is line ab. this is line b* this is the second line1. this in line 12. 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等信息

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

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台