IOS热重载工具InjectionIII

发布时间 2023-04-06 17:07:18作者: R1cardo

IOS热重载工具InjectionIII

支持 OC、Swift 以及 Swift 和 OC 混编项目的 UI 热重载工具,采取在模拟器(真机不支持)注入方式实现 UI 热重载,修改完 UI 直接 cmd + s,不用重新编译运行就能看到 UI 效果。?? Github ??

安装

github 下载最新 release 版本,或者 AppStore 下载安装即可,推荐 github 下载安装,github 更新比 AppStore 更新快。如果项目使用混编 OC 时,建议使用 github 的 releases 版本。

安装过后打开,点击 open project

WX20230406-163943_2x

并且勾选File Watcher

项目配置

AppDelegate 配置,在 didFinishLaunchingWithOptions 配置注入。 需要注意,先打开 InjectionIIIResources 路径,确认 bundle 文件的正确路径

  • OC
#if DEBUG
   // iOS
   [[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];

   // 同时还支持 tvOS 和 MacOS,配置时只需要在 /Applications/InjectionIII.app/Contents/Resources/ 目录下找到对应的 bundle 文件,替换路径即可
#endif
  • Swift
#if DEBUG 
do {
   let injectionBundle = Bundle.init(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")
   if let bundle = injectionBundle{
       try bundle.loadAndReturnError()
   } else {
        debugPrint("Injection 注入失败,未能检测到 Injection")
   }

} catch {
    debugPrint("Injection 注入失败 \(error)")
}
#endif

启动项目

此时启动项目,在控制台可以看到,表示注入成功了,如果有多个项目都在使用 Injection,需要查看 Injection 链接路径是否正确,如果不正确,打开 Injection 菜单 -Open Recent- 选择需要注入的项目即可。

WX20230406-164913_2x

WX20230406-164204_2x

页面文件配置

在需要热重载的页面 VC 中,实现 injected 方法,把操作 UI 方法添加到 injected 中即可。以 Swift 为例,比如 UI 操作都在 VC 的 viewDidLoad 中,那么就在 injected 添加 viewDidLoad 方法即可。如果项目都想使用,直接添加到 VC的基类 即可。

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

在 UI 阶段,修改外 UI,直接 cmd + s 就能看到效果,相当于保存之后就会走到injected方法,重新构建UI

额外配置

如果想对 final 方法和 structs 方法热重载,在 Build Settings - Other Linker Flags 中加入 -Xlinker,-interposable

WX20230406-164709_2x

限制

  • 它只支持模拟器,不支持真机
  • 不能增加或删除存储类型的属性和方法,如果有这种情况需要重新编译运行
  • 可以修改class、enum、struct 的成员方法的实现,但如果是inline函数则不行,如果有这种情况需要重新编译运行。