接触到Injectionlll 工具是在看了戴铭《iOS开发》高手课后,并随着目前自己负责的项目越来越大, 开发调试所占用的时间也越来越长的一个背景下, 着手使用了这款工具, 并去了解其背后的运行原理;
安装使用
作者开源了这款工具, 底部参考有直达链接,也可以在AppStore商店下载这款工具,

安装好以后,打开工具运行,会在顶部状态栏,显示该工具一个注射器图标,初始状态是蓝色, 后续配置好运行起来是橘红色

使用xcode创建一个demo项目, 在AppDelegate
文件里加入以下代码
#if DEBUG
// or oc
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
// or switf
//Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
// for tvOS:
//Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/tvOSInjection.bundle")?.load()
// Or for macOS:
//Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle")?.load()
#endif
然后点开Injectionlll工具菜单, 选择demo项目目录

然后运行项目, 在Xcode控制台打印如下

显示这样就配置好了,接着测试下,改动代码是否能做到热重载效果?
在需要的ViewController里,加入以下代码,
- (void)injected{
// [self viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
}
在
injected
方法里加入修改UI的代码, 保存即可展示效果,如果在viewDidLoad
方法里或者其它方法修改UI代码, 保存后,需要退出该页面, 再重新push
进页面,才可以看到效果。
Injectionlll 运行原理
Injectionlll 通过Fill Watcher
检测到项目源码改动,Injectionlll Server就会编译、打包成动态库,也就是.dylib
, 动态库用writeToString
方法通过socket
通知运行的app,Injectionlll client接收到消息inject(tmpfile: String)
方法,运行时进行动态类替,换,类方法被替换后,进行界面重新绘制界面, 整个过程无需重启和编译APP,动态库
极速调试的目的就达到了。
网友评论