引言
这篇博客是结合众多作者博客的基础上进行实践和整理出来的。从整体上来看,大部分的博客在整体流程上都没什么问题,但基本在SDK合成细节的描述往往不够详细,容易造成不少的误区,被坑在里面了都不知道。针对这个问题和躺过的坑,在整理做了更细致的描述,避免再犯。同时也有一些不明白的地方,有待进一步实践解惑,如有明白的博友欢迎留言。
1、创建一个workspace项目
1、现在桌面创建文件夹【SHTestSDk】文件夹,待用
2、打开Xcode,创建一个工作空间【workspace(流程: Xcode—File—New—Workspace 快捷键 :command +N = 创建项目)】,并把创建好的【workspace】添加到【SHTestSDK】文件中
创建成功效果
2、创建SDK
1、打开【SHTestSDK.xcworkspace】文件,创建project
成功效果图
3、创建Demo
成功效果图
4、SDK工程配置
1、这里创建一个SHView类,继承于UIView,简单的重写了初始化方法,设置了颜色
2、设置Build Setting参数 将Build Active Architecture only设置为NO,
3、设置Build Setting参数 在Architectures下增加armv7s
4、设置Headers,将要公开的头文件拖到Public下,要隐藏的放到Private或Project下,隐藏的头文件不能被引用,效果图:
工程配置集合:
点击目标工程 >> 选择你创建的Framework >> 点击工程设置 >> 做出如下修改 #1、(必)选择库类型:1、StaticLibrary是静态库;2、RelocatableObjectFile是动态库 Build Settings >> Mach-O Type >> Static Library #2、(必)设置适配所有模拟器/真机机型架构 Build Settings >> Build Active Architecture Only 设为NO #3、死代码剥离 Build Settings >> Dead Code Stripping >> 设置为NO #4、复制过程中删除调试符号 Build Settings >> Strip Debug Symbol During Copy >> 全部设置为NO #5、 Build Settings >> Strip Style >> 设置为Non-Global Symbols #6、是否连接到标准库 Build Settings >> Link With Standard Libraries >> 设置为 NO #7、(必)设置打包静态库的测试版和发布版(.a和.frameworke) product -> scheme -> Edit scheme -> Run->选择Debug或Release #8、(必) target-Build Phases - Headers -把需要公开的头文件从project拖入Public
5、在SHTestSDK.h(必须是公开的,否则无法引用)中将所有要公开的.h引入。
如下图就是我根据以上步骤创建的以【RTestSDK】为命名空间,含有一个【Demo】项目,一个【TestSDK】(里面有两个文件类),并且进行【command+B】编译。
下面是重点,有所差异和注意的就是在SDK打包。
5、SDK合成
SDK合成有两种方式,下面分别阐述两种不同合成方式以及注意细节。
SDK合成分类:终端合成、脚本合成。
5.1、终端合成
1、在文件导入/创建/处理之后,快捷键【command+B】进行编译,选择虚拟机编译(随便选择一个iphone手机机型)和 Generic in device(真机模式编译)两种模式,第一次进行编译时,对应的xxx.framework文件就会由红色变成黑色。说明编译成功。
在这里创建了两个类
编译之前
编译之后
2、右键点击.framework->show in Finder,可以看到对应文件的路径,打开终端查看对应文件支持的设备和机型
检查各自文件适配类型
3、在终端输入合并的命令
格式如下:
lipo -create 真机文件包的路径 虚拟机文件包的路径 -output 生成的文件路径(可以自己创建一个文件夹)
示例:
最后生成【TestSDK】(名字可以自定义)
注意: 合成的对象分别是真机【Debug-iphoneos】和虚拟机【Debug-iphonesimulator】文件下的【TestSDK】文件。
4、重复第2步骤,进入文件路径,复制一个【xxx.framework】文件到步骤3的生成文件的文件夹中
5、将【TestSDK.framework】文件里的【TestSDK】文件替换成外面一个的【TestSDK】,然后查看结果
如上图,说明合并成功,可以直接导入对应的工程项目中使用。
5.2、脚本合成
这里同石虎132博客中的流程相同,直接按流程操作即可
1、创建一个Aggregare
图16:
图17:
2、书写脚本工程名完成创建如下图
3、选择脚本工程BuBuild Phases 点击+号选择New Run Script Phase 添加(重要)
4、打开Run Script 将合成代码拷贝到脚本工程中如下图
5、嵌入脚本
脚本代码如下
# 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}"
6、选择脚本工程真机运行【command+B】
编译完成之后就会直接跳出文件,如下:
看上图,问题来了:
1、为啥什么文件都没有?跟终端合并的样式并不一样啊。
2、虽然【TestSDK.framework】文件什么东西都没有,但是直接导入项目还是可以找到文件,拿来应用。但是没有显示头文件,这一点很别扭。
3、既然没有头文件,那就把头文件导入,这样看起来就跟终端合并生成的结果看起来一样了,而且也能使用。
以上疑问,哪位热心大牛,知道的话希望告知,学习学习!
6、Demo与SDK的关联
1、把打包好的framework拖到demo里面
2、使用SDK,运行demo
注意: 以上功能就是SDK 和 demo 相关联好了.
7、SDK调试
1、修改下面SDK中的代码,运行Demo就是修改后的效果,这样就可以愉快的在这个工程里面开发调试SDK了。
例如我把【TestView】的颜色设置为redColor,直接去运行Demo,看一下效果
参考链接: