一、SDK工程
SDK工程包含所有SDK源码,真正的开发工程。
- 创建如下目录
- 创建SDK工程,选择Framework
- 进入工程目录,创建如下子目录
这是一个通用的目录,具体封装时应该不需要这么多目录。Controller和View存放UI相关文件;Depend存放依赖库文件,主要是内部库,注意与ThirdModule的区别;Logic用于存放业务逻辑处理文件,一般情况和VC配套使用;Model数据模型(多为UI数据模型);Reource模块内部资源;Service网络接口请求,处理网络数据;ThirdModule存放第三方库,这里区别于依赖模块(Depend),目前第三方库主要是Pod、framework和纯源码形式,对Pod形式,先用pod下载代码,然后将源码拷贝到ThirdModule目录,framework和纯源码形式,直接拷贝到ThirdModule目录,无论是哪种形式,一定要注意版本号的记录。
- 将子目录添加到工程中
- 然后创建相应文件
特殊说明一下,一个模块最好的设计应该只有一个接口文件,或者说对外提供的文件,也就是Manager类。这样设计的好处在于:文件越多,接口就会越多,使用出错也会增加,使用也不会很方便,更重要的是,当模块内部出现问题时,因为对外接口过多,排查问题也会比较麻烦。
- 创建脚本
- 添加依赖
-
编写脚本文件
UNIVERSAL_OUTPUTFOLDER=../Output/ # 创建输出目录,并删除之前的framework文件 mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" rm -rf "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" # 分别编译模拟器和真机的Framework xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" # 拷贝真机的framework到univer目录 cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" # 合并framework,输出最终的framework到build目录 lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
添加脚本
- 设置脚本文件路径
- 选择targets->Universal进行build
如果出现下面错误
控制台进入脚本文件所在的目录,执行下面命令:
chmod 755 build-universal-framework.sh
- 额外配置,前面创建工程时,添加了Configurations目录,此目录用于保存配置信息。xcconfig文件是一个用来保存Build Settings键值对的纯文本文件。这些键值对会覆盖Build Settings中的值。所以当在xcconfig文件中配置了的选项在Build Settings中怎么设置都不会再起作用
- 添加配置文件
- 然后可以在Project进行设置
根据具体情况进行设置,此处不做详细介绍。
- 特殊说明
- 默认情况下创建的Framework是动态库形式,如果要创建静态库形式的,修改如下参数:
- 在对第三方SDK进行封装时,由于第三方SDK可能提供的是源码和Framework。对于源码,可以直接包含到模块中,但对于Framework,就需要区分静态库和动态库两种情况:1、静态库可以直接包含到模块中;2、动态库不建议包含到模块中,而是与模块一同提供给用户使用。静态库和动态库的区分方法是通过file命令。
- 关于第三方SDK提供的Bundle文件,也要单独提供,以防止造成资源无法找到。
二、Samples工程
此工程用来调试SDK接口,演示如何使用SDK。
- 创建工程
- 添加template.framework到工程中
- 编写调试代码,然后运行调试
- 运行时如果出现下面异常
这是因为你使用的是动态库,没有加载到APP中,修改设置如下:
- 如果经过Demo使用SDK接口,没有发现问题,到此可以算是此SDK开发完成,可以将此SDK模块进行内部自测或提交QA系统测试。另外一种情况是,发现调用SDK接口时,没有得到预期结果,此时需要对SDK进行联调。
三、在Samples工程中调试SDK工程
在工程目录里创建一个Module目录
然后在控制台进入Module目录
- 创建templateSDK目录快照如下
- 复制一个新的targets,在新的targets中删除templateSDK.framework,因为下面将使用工程中的templateSDK.framewrok
- 修改名字如下
- 将templateSDK工程添加到templateTFW工程上
- 添加工程依赖
- 加载动态库
- 运行调试
此时在templateSDK工程中修改代码,templateTFW工程运行就可以看到修改效果了。
最后
以上方法是一个通用编写SDK的方法,实际情况可能会复杂些,需要具体对待。今后也会补充特殊情况的处理和注意事项,也希望大家提出宝贵意见。
附上Demo下载