iOS 模拟器界面调试利器Injectionlll

在做热更技术调研的时候,无意中在GitHub发现这个模拟器界面调试hotfix的方案,就做了进一步的了解,这个工具是开源的,用好这个能提升你的开发效率。By the way,xib上面修改界面后command+S没起作用,只能拉到VC里边用代码控制才生效。

想用它主要有以下4个步骤:

1.下载安装Injectionlll
B307E006-13A5-4319-9317-C1629D620FBD.png
2.在调试页面的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.png

F4E9DF66-D118-45DE-8815-4412121A1102.png
附上Injectionlll 运行原理

Injectionlll 通过Fill Watcher检测到项目源码改动,Injectionlll Server就会编译、打包成动态库,也就是.dylib, 动态库用writeToString方法通过socket通知运行的app,Injectionlll client接收到消息injected(tmpfile: String)方法,运行时进行动态类替换,类方法被替换后,进行界面重新绘制界面, 整个过程无需重启和编译APP,达到了动态库极速调试的目的。

GitHubDemo

你可能感兴趣的:(iOS 模拟器界面调试利器Injectionlll)