John Holdsworth 開發了一個叫作 Injection 的工具可以動態地將 Swift 或Objective-C 的代碼在已運行的程序中執行,以加快調試速度,同時保證程序不用重啟。
使用方法:
1、App Store下載Injectionlll。
2、項目工程配置。
在我們自己的工程 AppDelegate.swift 文件的 didFinishLaunchingWithOptions 方法中進行注入
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
在ViewController里面寫入injected方法,swift要寫@objc。
@objc func injected() {
viewDidLoad()
self.view.backgroundColor = UIColor.orange
}
寫入你想要動態更改的代碼
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.lightGray
self.view.addSubview(button)
// 更改約束的時候沒有清空之前的約束,會存在兩個約束,造成約束沖突,所以先清空。若是不清空的話需要重新進入頁面才能生效。
button.snp.removeConstraints()
button.snp.makeConstraints { (make) in
make.centerX.equalToSuperview()
make.top.equalTo(100)
make.height.equalTo(30)
make.width.equalTo(100)
}
button.setTitle("sdddd", for: .normal)
}
3、開啟監控。
打開Injectionlll,在菜單欄點擊Injectionlll,下拉選中open Project,打開iOS工程目錄。
遇到問題:
1、真機,cmd+s無效?
只支持模擬器調試。
2、swift不生效?
在swift中方法injected前要加@objc。
3、frame布局生效,snapkit約束不生效?
更改約束的時候沒有清空之前的約束,會存在兩個約束,造成約束沖突,所以先清空。若是不清空的話需要重新進入頁面才能生效。
原理介紹:
啟動了一個mac server監控工程目錄,cmd+s的時候,獲取injected方法內的代碼,生成新的dylib文件,替換舊的動態鏈接庫,實現即時刷新UI。