美文网首页
iOS 模拟器界面调试利器Injectionlll

iOS 模拟器界面调试利器Injectionlll

作者: 王看山 | 来源:发表于2022-06-29 13:19 被阅读0次

    在做热更技术调研的时候,无意中在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

          本文链接:https://www.haomeiwen.com/subject/zkytbrtx.html