IOS sdk制作踩坑记

最近突然对sdk的制作有了兴趣,由于之前项目都不需要自制sdk,所以算是自己试着玩玩;现在大家在使用第三方控件时还是喜欢pod,毕竟使用方便也不需要自己导入一堆framework、bundle,所以下次可以尝试pod的制作;

1.创建framework项目

1.首先新建一个framework项目

1.png

命名为SDKTest

2.新建一个ViewController包含xib(可以写纯代码的view)

2.png

3.写点小功能

3.png

4.配置

Edit scheme-Run-Build Configuration设置为Release
TARGETS->Build Settings->Enable Bitcode 设置为No (模拟可不设,真机要设置)

5.设置公开头文件,在public中添加你要暴露的头文件


4.png

我选择SDKTest为公共头,将其他头文件都包含进去

5.png

2.创建bundle

6.png

TARGETS -SDKTestBundle-BuildSettings-Base SDK 设置 iOS
Enable Bitcode 设置为NO(模拟可不设,真机要设置)
Edit scheme-Run-Build Configuration设置为Release

1.将你要添加的文件导入(各种资源文件类似图片等)

7.png

2.选择你想要的类型(模拟器或真机),command + B 编译

9.png
10.png

products中会出现你生成的.bundle


11.png

这个bundle可以直接使用,也可以添加到framework中

3.编译项目

1.制作sdk合并脚本,合并模拟器及真机sdk,方便开发,正式上线只需提交真机sdk

12.png
13.png

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的真机及模拟器版本


14.png
15.png

此时products中已经有.framework文件了


16.png
17.png

4.选择Merge,跟上面一样选择release,然后build,你会发现一个Products的文件夹,内部已经是合并真机及模拟器的framework


18.png

5.创建一个新项目,导入.framework及.bundle

在项目的general中添加framework,这很重要不然会报错

dyld`__abort_with_payload:
19.png

6.页面调用


20.png

7.测试


gif.gif

遇到的坑

在参考别人资料时,发现别人调用xib使用

self = [super initWithNibName:@"SDKTestViewController" bundle:[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"SDKTestBundle" withExtension:@"bundle"]]];

然后运行sdk时一直报错,于是在Tests中测试


21.png

发现是url的问题

改为

    self = [super initWithNibName:@"SDKTestViewController" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle]pathForResource:@"SDKTestBundle" ofType:@"bundle"]]];

运行就可以了。

在制作sdk是可以使用测试单元自己跑一边,没问题后将文件拷出来在测试项目中运行,运行无误再生成sdk

附github地址: https://github.com/TimWang10086/SDkDemo.git

你可能感兴趣的:(IOS sdk制作踩坑记)