iOS 最新生成Framework流程(二)

2,735 阅读4分钟

序言

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的架构详解:

www.jianshu.com/p/6f3f61374…

www.jianshu.com/p/567d3b730…

juejin.cn/post/684490…

编译项目

如果以上配置已经完成,这时候需要分别在真机环境和模拟器环境编译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 最终是这样恭喜你这个包就是你的静态库。