是否可创建包含完整iOS应用代码、storyboard及frameworks的iOS static library
iOS 静态库常见问题解答
问题1:能否创建包含完整iOS应用代码、全部storyboard以及所有关联frameworks的iOS静态库?
可以实现,需要注意以下约束:
- 静态库仅存储编译后的二进制代码,无法直接承载资源文件,你已经验证过的配套独立bundle承载资源的方案是正确路径,所有storyboard、xib、图片、本地化文件等资源都需要打包到和静态库绑定的独立bundle中,主工程集成时需同时引入静态库和对应bundle。
- 原有应用的全部业务代码可直接编译进静态库,你需要对外暴露核心入口方法,例如
+ (UIViewController *)getAppRootController,供主工程调用替代原应用的main入口逻辑即可。 - 依赖的系统framework无需打包进静态库,仅需要在静态库项目的
Link Binary With Libraries配置项中添加对应依赖,主工程集成时会自动完成系统库的链接。
问题2:iOS静态库是否支持嵌入外部frameworks?
静态库本身不支持直接内嵌外部framework,需分场景处理:
- 若依赖的是外部静态framework:可通过
libtool命令将外部静态framework的编译产物和你的静态库合并为一个通用静态库,主工程集成时不需要额外引入该外部静态依赖。 - 若依赖的是外部动态framework:静态库无法内嵌动态库,你需要在集成文档中明确告知使用方,集成你的静态库时需同时将对应动态framework加入主工程的
Embed Frameworks配置项。
注意:禁止将动态framework强行打包进静态库产物中,苹果审核会检测到签名异常/重复动态库,大概率会被拒审。
问题3:是否有对应的实现示例可供参考?
以下是核心实现步骤的代码示例:
- 新增NSBundle分类,用于静态库内部读取配套bundle资源
// NSBundle+MyStaticLib.h @interface NSBundle (MyStaticLib) + (instancetype)msl_libBundle; @end // NSBundle+MyStaticLib.m @implementation NSBundle (MyStaticLib) + (instancetype)msl_libBundle { static NSBundle *libBundle = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"你的bundle名称" ofType:@"bundle"]; libBundle = [NSBundle bundleWithPath:bundlePath]; }); return libBundle; } @end
- 静态库内部加载storyboard示例
// 从配套bundle加载storyboard UIStoryboard *mainSb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle msl_libBundle]]; // 实例化入口控制器 UIViewController *rootVc = [mainSb instantiateInitialViewController];
- 合并多个静态库的命令示例
libtool -static -o ./MergeResult.a ./YourLib.a ./ThirdPartyLib1.a ./ThirdPartyLib2.a
内容的提问来源于stack exchange,提问作者Giacomo
相关产品推荐
相关产品推荐

