IOS热重载工具InjectionIII
IOS热重载工具InjectionIII
支持 OC、Swift 以及 Swift 和 OC 混编项目的 UI 热重载工具,采取在模拟器(真机不支持)注入方式实现 UI 热重载,修改完 UI 直接 cmd + s,不用重新编译运行就能看到 UI 效果。👉🏻 Github 👈🏻
安装
github 下载最新 release 版本,或者 AppStore 下载安装即可,推荐 github 下载安装,github 更新比 AppStore 更新快。如果项目使用混编 OC 时,建议使用 github 的 releases 版本。
安装过后打开,点击 open project
并且勾选File Watcher
项目配置
AppDelegate 配置,在 didFinishLaunchingWithOptions 配置注入。 需要注意,先打开 InjectionIII 的 Resources 路径,确认 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- 选择需要注入的项目即可。
页面文件配置
在需要热重载的页面 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
限制
- 它只支持模拟器,不支持真机
- 不能增加或删除存储类型的属性和方法,如果有这种情况需要重新编译运行
- 可以修改class、enum、struct 的成员方法的实现,但如果是inline函数则不行,如果有这种情况需要重新编译运行。