序言
1、本文是生成带有cocoapod的版本,如果需要不带cocoapod版本请看(一)
2、SDK是通过脚本生成,并且包含模拟器和真机。
3、本文生成的是静态库,如果不了解动态库和静态库区别点击以下链接。链接地址
4、环境:Xcode版本11.1、OS版本:10.15。
5、对于每一步的配置我都会有一个简单的解释。
创建工程
创建workspace:
test_sdk.h:说明一下这个文件不要轻易的删除,点击去看下就知道有啥用了,因为之前同事就不小心删除了所以这里特别说明一下 “In this header, you should import all the public headers of your framework using statements like #import”配置Build Settings
- Architectures:这个是需要添加armv7s,因为standard architecture = arm64,armv7; 是不包含armv7s,我看有的博客说是不需要添加,可能是因为Xcode版本不一样,所以建议大家生成framework之后还是通过lipo -info查看一下,这是查看支持的arm架构最准确的。
- Build Active Architecture Only:这个设置为NO,一般在我们开发过程中Debug下需要设置为YES,主要是为了加快编译速度,目前我们是sdk,都需要支持所以设置为NO
- Valid Architectures:这个意思是目前支持的有效的框架,但是不是编译生成的ipa支持的arm架构,实际生成的架构是取 Valid Architecture 和Architectures的交集
- Link With Standrad libraries: NO
- Mach-O Type: Static Library: Static Library 静态库
- 因为采用的cocoapod管理三方库,最终也是会打包到framework,所以这个project,target 都是需要配置的,Xcode默认是用的模拟器,不支持真机,需要添加下边的arm架构
关于Architectures的架构详解:
编译项目
如果以上配置已经完成,这时候需要分别在真机环境和模拟器环境编译sdk,如果都编译成功说明sdk配置没有问题
添加Demo
添加依赖库:截图的两种方式可以任意选择一种 添加了一个测试类,一个测试方法,需要注意的是如果需要在外部调用这个类的话,那么需要在build phases 里边吧TestClass拖到public里边才可以,然后在test_sdk.h文件中引用。运行结果
导出framework
Aggregat: An aggregated target is an Xcode target that lets you build a group of targets at once. It doesn't have any Products itself, like an app for an app target or a framework for framework targets. It doesn't have build rules either, but it can have a Run Script build phase or a Copy Files build phase only 点击+ 选择new run Script phase 然后把下边脚本复制进去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
脚本解释: 之前我是觉得这种脚本直接网上copy应该不会有太大问题,但是这次我在实际开发过程中发现脚本版本很多,到底取哪个,以及脚本运行生成的framework放到哪个文件夹,所以特意研究了一下: INSTALL_DIR: 这是包最终生成的framework路径,也就是这个文件夹
最终我们会把真机和模拟器都打包到这个里边 DEVICE_DIR:这是真机的framework地址,你可以选中真机然后command+B,点击framework然后show in folder SIMULATOR_DIR:这是模拟器的framework地址,同样选中任意一个模拟器然后command+B,点击framework然后show in folder基本流程就是:
结束
如果不出问题的话,是会打开products这个文件夹,然后里边会有编译生成的framework,导入到其他工程就可以使用了
可能出现的错误
这个我在生成sdk过程中出现的错误,如果有跟我遇到的情况一下可以试试下边解决方法:
- -lPods-xxx is not an object file (not allowed in a library) 这种错误就是因为这个cocoapod不支持模拟器或者真机,或者是cocoapod下边有的库是不支持模拟器真机,需要手动配置一下:
1)查看PROJECT pods下边Build Active Architecture Only 是否为NO
2)查看Valid Architectures 是否支持对应的arm架构
3)Podfile里边是否需要设置use_frameworks!
- not found for architecture i386 (xxxx.h not find) 这就是没有在模拟器找到这个库,或者是这个类文件,这时候可以尝试下边解决方法
1)点击targets下边的项目,把framework添加到项目里边
2)配置target下边的search Paths - Header Search Paths 有两种方法一种是non-recursive 非递归查找;recursive 递归查找可能需要的命令
如果你不确定你的framework生成的是否正确,或者你想要查看生成的framework是真机还是模拟器,还是真机+模拟器,请用下边的命令:
查看库信息: lipo -info sdkPath 看清楚是最终生成的sdk文件,而不是sdk.framework 打开终端,输入lipo -info 然后把
这个拖到终端,回车就ok了。 这个说明当前的包是模拟器的。 这个说明当前包是真机环境的。 运行test_agg 查看生成的framework 最终是这样恭喜你这个包就是你的静态库。