引子
-
无意间,看到5年前,Android大佬子勰写的,关于SDK开发方面的文章(SDK那些事(总纲)), 不由得唤起自己开发iOS SDK的回忆;本文简单总结下自己开发SDK方面的经验;
-
SDK(Software Development Kit)可以最大程度实现代码和功能的复用,为业务开发提供一个非常好的支持;这里的业务可以是内部业务,也可以是外部业务;
-
简单来说,所谓SDK开发,本质是服务提供;不仅需要写好代码,还要完善代码之外的事情,任重道远
一、准备
1、清晰解决的问题和要求
一般而言,新起一个SDK必然有其深刻的业务背景;研发同学对SDK要解决的问题和SDK的特殊要求,了解地越详细越好;常见的要求有:
- 禁止采集用户信息【安全方面】
- 必须对SDK使用者鉴权【安全方面】
- 核心代码必须混淆【安全方面】
- 不可以有调试日志,不可以监控上报【安全方面】
- 持久化的敏感数据要加密;【安全方面】
- SDK大小不可以超过
XX
KB:【其他】 - …
2、选择合适的开发语言
- 大多数情况下,选择Objective-C开发就对了,不仅能接入Swift开发的项目,还能接入Objective-C开发的项目;
- 当然并非绝对,具体根据业务情况决定;
3、选择合适的技术方案
- 网络请求使用第三方框架,还是直接利用iOS的API;
- JSON转Model、Model序列化和反序列选择哪个第三方框架(性能,框架大小方面考虑)
- 持久化存储选择SQLite、NSUserDefaults 或是 Keychain;
- UI布局使用 frame、autolayout(Masonry框架) or flexbox(YogaKit框架)
- MVVM or MVC 架构模式选择;
- …
4、确立基本代码规范
SDK可能长期维护 或 多人开发,确立好基本代码规范,能保障SDK的代码质量;这些规范本质上是一些共识和约束,如:
- 命名规范:属性、变量、方法等均采用小写字母开头的驼峰命名;类名使用大写字母开头的驼峰命名;
- 注释要求:对外暴露的类、方便和变量要有注释,解释其功能;关键代码要有注释;
- 简洁要求:无用的代码选择直接删除,不要注释;无用的资源及时清除;
- …
二、SDK的主体设计
1、多模块设计
-
SDK中可能包含不同的模块功能,而不同的业务方需要的模块可能不同;对SDK中模块进行拆分,保证业务方尽可能引入的是他们需要的代码;
-
一般使用Cocoapods创建Pod库的,在
podspec
中定义好模块,为每个模块清晰定义好包含的代码和资源,以及外部依赖(静态库 or 静态库);这样可以将模块之间实现代码和资源的物理隔离; -
关于Cocoapods创建Pod库更多细节可以参考Cocoapods使用小记,至于是公有Pod还是私有Pod根据实际情况定;
创建公有Pod库或者私有Pod库原理是一样的;不一样的是:两者的版本索引查询方式不一样,公有库的podspec由CocoaPods/Specs管理,而内部私有使用的pod库需要公司内部建立一个仓库来管理podspec
2、SDK目录层级
-
Pod库中,代码放在
Classes
目录下,图片资源放在Assets
目录下; -
Classes
目录按模块划分第一级目录,如AModule
、BModule
、CModule
等,其中每个模块Code再划分二级目录,如ModuleService、View、Controller、Model、API等;具体的代码文件存放在这些二级目录中;其中ModuleService
中代码是要对外暴露的,其他预期外部不可见; -
资源方面,也按模块细节;主要的资源是图片资源,在
Assets
目录下新加AModule.xcassets
、BModule.xcassets
、CModule.xcassets
等;