一直在搞开发,也没好好捋捋思路,就抽空总结一下
OC、Swift打包静态库,嵌入APP
演示项目地址:https://github.com/ySeasons/CustomFramework
1、场景:
介绍:
2、什么是库?
共享代码便是库,实现代码的复用,一般分为静态库和动态库
区别:
静态库:链接时完整的拷贝到可执行文件,多次使用多次拷贝,造成冗余,使包变得更大
动态库:链接时不复制,程序运行时由系统加载到内存中,不论系统加载次数,共用节省内存
iOS静态库: .a 和 .framework 文件
iOS动态库: .dylib 和 .framework 文件
.framework 有动态/静态库?:系统的架构是动态的,自己创建的是静态的
.a和.framework区别:
.a是单纯的二进制文件
.framework是二进制文件+资源文件
.a不能直接使用,需要.h文件配合 / .framework可以直接使用
.framework = .a + .h + Resources(资源文件)
为什么使用静态库?
共享代码,方便使用;
实现iOS程序的模块化,业务模块化,减少开发的重复劳动;
与他人分享代码,但不想他人知道代码的具体实现;
开发第三方SDK;
其他项目集成调用
3、注意点
打包.framework的项目(子项目)中:
-AppDelegate、SceneDelegate 不要打包静态库中,文件中的操作要封装成接口暴露出去
-项目中的三方库cocoapods管理,可以不用打包进静态库,(说明依赖哪些第三方库)
:主工程与子工程公用,主工程集成三方库;
:若子项目打包了某个第三方库,主项目也用到该三方库,那么子项目要把该三方库在header暴露出来供主项目调用,主项目不要再集成此库
-.pch文件重新设置地址
-资源文件:默认情况下,静态库只会打包代码文件,
创建bundle文件夹,把图片、Images.xcassets、plist、xib、storyboard、文件等打包
- 主工程和子工程 文件命名不要相同,会出现问题
嵌入到主工程中:
<下面会具体指出>
本文以主工程(YYMain)和子工程(YYSub)来说明
过程:
1、YYSub是一个可以运行的子项目
2、新建YYSubFramework静态库工程,配置:
:CocoaPods 同步子工程的三方库安装 pod install
:YYSub文件拖入YYSubFramework
:创建bundle文件,拖入资源文件
:重新配置 .pch 文件路径
:删除AppDelegate文件
:新建继承与NSObject的类对外开放(YYSubOpen.h在拖入header中)
(此类中把AppDelegate中的方法实现封装)
:Mach-O Type 选择 Static Library (静态库)
:Architectures 默然arm64、armv7,(若支持老版本,请查资料)
:编译成功之后Products下的文件,就是打包成功的静态库
(YYSubFramework.framework)
注意:支持设备、版本号保持一致
打包过程中可能遇到:
.pch文件地址重新设置
.plist、read.md 等文件重复
Architectures 设置
...等问题,分别对应解决
新建 **framework库工程
YYSubOpen代码 如下:
.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface YYSubOpen : NSObject
//跳转视图
- (UITabBarController *)openSubApp;
//配置内容
- (void)configSetting;
@end
.m
#import "YYSubOpen.h"
#import "YYTabBarViewController.h"
@implementation YYSubOpen
//跳转视图
- (UITabBarController *)openSubApp {
return (UITabBarController *)[[YYTabBarViewController alloc] init];
}
//配置内容
- (void)configSetting {
// 配置一些三方设置
// 账号是否连通
// 。。。。
}
@end
YYMain主工程引入 YYSubFramework.framework静态库
导入
#import <YYSubFramework/YYSubOpen.h>
// 调用跳转代码如下
#import "YYMainViewController.h"
@interface YYMainViewController ()
@end
@implementation YYMainViewController
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
[self.tabBarController.tabBar setHidden:NO];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.title = @"首页";
UIButton *button = [[UIButton alloc] init];
button.frame = CGRectMake(50, 150, 200, 50);
[button setTitle:@"跳转sub-App" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button addTarget:self action:@selector(goToSubApp) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)goToSubApp{
[self.tabBarController.tabBar setHidden:YES];
[self.navigationController setNavigationBarHidden:YES animated:YES];
YYSubOpen *subApp = [[YYSubOpen alloc] init];
[subApp configSetting];
UITabBarController *tabVC = [subApp openSubApp];
[self.navigationController pushViewController:tabVC animated:YES];
}
@end
// 子App 返回代码
- (void)backClick{
[self.tabBarController.navigationController popToRootViewControllerAnimated:YES];
}
演示项目地址:https://github.com/ySeasons/CustomFramework
参考链接:
https://www.jianshu.com/p/b1859dc04fbd
https://www.jianshu.com/p/826c9af4323c
https://www.jianshu.com/p/44f924a44b76
https://www.jianshu.com/p/f6356a7bef25
https://www.jianshu.com/p/6790fc295f48?appinstall=0