最近突然对sdk的制作有了兴趣,由于之前项目都不需要自制sdk,所以算是自己试着玩玩;现在大家在使用第三方控件时还是喜欢pod,毕竟使用方便也不需要自己导入一堆framework、bundle,所以下次可以尝试pod的制作;
1.创建framework项目
1.首先新建一个framework项目
命名为SDKTest
2.新建一个ViewController包含xib(可以写纯代码的view)
3.写点小功能
4.配置
Edit scheme-Run-Build Configuration设置为Release
TARGETS->Build Settings->Enable Bitcode 设置为No (模拟可不设,真机要设置)
5.设置公开头文件,在public中添加你要暴露的头文件
我选择SDKTest为公共头,将其他头文件都包含进去
2.创建bundle
TARGETS -SDKTestBundle-BuildSettings-Base SDK 设置 iOS
Enable Bitcode 设置为NO(模拟可不设,真机要设置)
Edit scheme-Run-Build Configuration设置为Release
1.将你要添加的文件导入(各种资源文件类似图片等)
2.选择你想要的类型(模拟器或真机),command + B 编译
products中会出现你生成的.bundle
这个bundle可以直接使用,也可以添加到framework中
3.编译项目
1.制作sdk合并脚本,合并模拟器及真机sdk,方便开发,正式上线只需提交真机sdk
2.写入shell脚本,也可以在终端中手动合并网上有方法不过不方便
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi
3.编译framework的真机及模拟器版本
此时products中已经有.framework文件了
4.选择Merge,跟上面一样选择release,然后build,你会发现一个Products的文件夹,内部已经是合并真机及模拟器的framework
5.创建一个新项目,导入.framework及.bundle
在项目的general中添加framework,这很重要不然会报错
dyld`__abort_with_payload:
6.页面调用
7.测试
遇到的坑
在参考别人资料时,发现别人调用xib使用
self = [super initWithNibName:@"SDKTestViewController" bundle:[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"SDKTestBundle" withExtension:@"bundle"]]];
然后运行sdk时一直报错,于是在Tests中测试
发现是url的问题
改为
self = [super initWithNibName:@"SDKTestViewController" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle]pathForResource:@"SDKTestBundle" ofType:@"bundle"]]];
运行就可以了。
在制作sdk是可以使用测试单元自己跑一边,没问题后将文件拷出来在测试项目中运行,运行无误再生成sdk
附github地址: https://github.com/TimWang10086/SDkDemo.git