iOS 热重载 Injection

563 阅读1分钟

原理:

通过重新构建类对象, 生成动态库, 替换动态库的方式。

1. 安装 Injection

github 下载最新的 release 版本(Injection.app), 安装在 mac 上

2. 项目配置

Swif 配置

#if DEBUG
        do {
            let injectionBundle = Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")
            // 支持 SwiftUI, 配置相应的bundle 即可
            if let bundle = injectionBundle {
                try bundle.loadAndReturnError()
            } else {
                print("Injection bundle 不能载入")
            }
        } catch  {
            print("Injection 注入失败")
        }

 #endif

OC 配置

#if DEBUG 
//iOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
//同时还支持tvOS和MacOS,配置时只需要在/Applications/InjectionIII.app/Contents/Resources/目录下找到对应的bundle文件,替换路径即可 
#endif

3. 打开 Injection 选择项目文件路径

截屏2022-07-15 上午11.18.48.png

这里注意 file watcher 是勾选的。点击 Open Project, 找到你的项目文件地址并选中

4. 启动项目

查看控制台, 看到如下输出, 说明注入成功:

**💉 InjectionIII connected /Users/apple/Downloads/TestDemo01/TestDemo01.xcodeproj**

**💉 Watching files under the directory /Users/apple/Downloads/TestDemo01**

TestDemo 是我测试的Demo项目

5. 注入页面的配置

在 ViewController 中加入如下配置:

Swift 版本

@objc func injected() {
    #if DEBUG
    self.viewDidLoad()
    #endif
}

OC 版本

- (void)injected {
    #if DEBUG
    [self viewDidLoad];
    #endif
}

6. 验证

在模拟器已经启动的前提下, 修改注入页面的 UI 相关代码, command+s, 之后看模拟器界面是否发生改变 部分页面可能需要重新进入该页面才能看到效果。

7.异常情况

ps:当你的项目使用unowned时,修改完UI,按com+s并没有相应的效果,则删除injected方法,在需要热重载的界面或者(baseVC)添加通知INJECTION_BUNDLE_NOTIFICATION即可

NotificationCenter.default.addObserver(
    self,
    selector:#selector(hotReloadingUI),
    name: Notification.Name("INJECTION_BUNDLE_NOTIFICATION"),
    object: nil
)

参考链接