原理:
通过重新构建类对象, 生成动态库, 替换动态库的方式。
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 选择项目文件路径
这里注意 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
)