在做热更技术调研的时候,无意中在GitHub发现这个模拟器界面调试hotfix的方案,就做了进一步的了解,这个工具是开源的,用好这个能提升你的开发效率。By the way,xib上面修改界面后command+S没起作用,只能拉到VC里边用代码控制才生效。
想用它主要有以下4个步骤:
1.下载安装Injectionlll
B307E006-13A5-4319-9317-C1629D620FBD.png2.在调试页面的VC添加监听代码(我直接把它放到了父类ViewDidLoad中,免得每个要调试的页面都要添加一遍)
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor;
#if DEBUG
//InjectionIII调试代码
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(injected) name:@"INJECTION_BUNDLE_NOTIFICATION" object:nil];
#endif
}
3.弄个UIViewController的分类,做软件关联和动态为所有VC添加injected方法
//InjectionIII调试代码
#if DEBUG
/**
InjectionIII 热部署会调用的一个方法,
runtime给VC绑定上之后,每次部署完就重新viewDidLoad
*/
void injected (id self, SEL _cmd) {
//重新加载view
[self loadView];
[self viewDidLoad];
[self viewWillLayoutSubviews];
[self viewWillAppear:YES];
[self viewDidDisappear:YES];
}
+ (void)load {
//注册项目启动监听
__block id observer =
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
//更改bundlePath
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
//给UIViewController 注册injected 方法
class_addMethod([UIViewController class], NSSelectorFromString(@"injected"), (IMP)injected, "v@:");
}
#endif
4.开始调试,command+R运行工程后成功链接后是橙色,没链接成功是蓝色的
0FCB468E-0DF4-453A-BF14-6255970ECB18.pngF4E9DF66-D118-45DE-8815-4412121A1102.png
附上Injectionlll 运行原理
Injectionlll 通过Fill Watcher检测到项目源码改动,Injectionlll Server就会编译、打包成动态库,也就是.dylib, 动态库用writeToString方法通过socket通知运行的app,Injectionlll client接收到消息injected(tmpfile: String)方法,运行时进行动态类替换,类方法被替换后,进行界面重新绘制界面, 整个过程无需重启和编译APP,达到了动态库极速调试的目的。
网友评论