公司内部项目多使用的是组件化的开发,可以把项目打包后给内部或者外部公司集成使用,但是在打包给公司内部的app打包到TestFlight中进行内部测试发现项目内有一个我们自己开发维护的库内的所有资源文件都获取不到了,这个项目库是利用cocoapods管理生成的,所以进行排查后找到症结所在做一次技术总结以及分享;
在出现问题后,我仔细对项目目前可能出现的问题进行了几点总结,目前排查到得出来的问题有以下几个:
1.项目是模块化的,出现问题的包是特定的一个单独进行改造后的pod库;
2.项目在进行Jenkins打包的时候没出现这个出现问题的框架内找不到资源文件的问题;
3.进行验证的时候检查来代码中bundle获取方式是以这种方式获取的:
NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"xxxx" ofType:@"bundle"];
断点时发现路径是可以正常获取的,那么打包给外部使用的时候肯定也是可以获取的到路径的。
4.在项目内也断点进行资源查找,发现项目资源在主工程中都可以在控制台打印出来,可以保证资源文件是已经打包进去了的;
5.在打包出来的ipa包检查到出现问题的framework中显示包内容的时候也可以发现bundle正常,利用AssetCatalogTinkerer
解包获取.car资源文件确认了数据没有丢失。
6.出现问题的框架做过改造使用了资源文件打包成bunlde包的方式;
在经过网上查询资料后发现apple developer中也有一位哥们出现了相似问题 点击跳转
在经过阅读当前帖子后就清晰很多,发现Xcode13 新增打包选项 manageAppVersionAndBuildNumber 默认开启,会同步修改版本号:CFBundleVersion,CFBundleShortVersionString,bundle版本号 小于 framework版本号 且framework与bundle同名 且属于同一模块,认为资源文件是过期的,不进行查找,导致framework无法加载bundle内的资源文件。
解决方案:
1.将出现问题的framework的资源文件拷贝一份到mainBundle中;
2.修改TestFlight包 manageAppVersionAndBuildNumber 配置设置为关,不同步修改版本号;
3.修改bundle名称,使bundle的名称不同于framework的包名;