开发SDK一般需要三个工程:
- 研发SDK工程;2.生成SDK工程;3.SDK使用demo工程
SDK一般有两大优点:
1.防止别人看到代码和实现; - 组件化,提高代码复用率(SDK也算一个功能组件,和pod导入的工程一样)。
一般SDK只是实现部分特定功能。把整个app都做成sdk,那是设计的错误。首先完整app需要大量第三方库,这样也要把第三方库也转化包含到SDK中,使用SDK的app也需要大量第三方库,很难处理内外库的版本冲突问题。这样复杂的SDK,用户也很难使用。做SDK的人或许可以给予这个复杂SDK做出一个app,其它的人不懂内部实现,很难实现基于这个SDK开发出新的app。由于存在库版本冲突问题,所以建议SDK中尽量不用第三方库,SDK中可以有少量页面,实现特定高内聚功能为佳。如支付功能做成SDK最合适。
SDK使用demo工程可以提供给外部使用者或开发测试人员,没有保密要求。开发人员大都是在研发SDK工程开发,只是最后向外提供SDK使用demo工程时才使用生成SDK工程产生.framework或.a库,拷贝到SDK使用demo工程,并更新资源库。
研发工程主要是为了调试和打印日志,这样能大大提高开发和定位问题的效率。一般xcode定位问题通过:1.设断点调试;2.在工程中搜索页面上的文本内容(不是从后台获取的内容,如页面标题);3.打印从后台获取的数据(最好日志中有文件名,函数名,日志所在的行数);4.View UI Hierarchy(正常的页面都能看到图层和直接看到图层的类名,部分页面需要内存很大导致无法看到,也有少部分非标准页面无法看到图层的类名)。对外提供的头文件和使用的sdk的文件包含sdk内头文件一般采用绝对路径,研发工程是使用全局搜索路径。所以为了方便修改,需要提供sdk的日志开关宏(sdk内头文件定义)和头文件包含宏(对外开放的总头文件定义)。
研发SDK工程: 配置两个宏定义为1。 ```c #ifndef TEST_SDK //生产环境为0,测试环境为1 #define TEST_SDK 1 #endif
配置为1可以打印日志
若SDK中打印的日志很少,可以用测试宏包含起来就可以了。若打印日志比较多建议使用宏定义重载打印日志函数,这样可以很方便的开关打印日志。 ```c #if TEST_SDK #define NSLog(...) NSLog(__VA_ARGS__) #else #define NSLog(...) #endif
由于研发工程对外头文件采用全局搜索的方式包含头文件,使用SDK的工程采用全路径包含头文件,这样尽量防止SDK内外冲突,所以要采用编译宏控制包含头文件的方式。
#ifndef DEV_SDK //非研发SDK项目为0, 研发SDK项目为1 #define DEV_SDK 1 #endif
配置为1,解决研发工程头文件包含。
#if DEV_SDK #import "FHFollowListUnitEntity.h" #else #import <TestSDK/FHFollowListUnitEntity.h> #endif