本文為投稿文章,作者:@沒故事的卓同學
今天強烈推薦一個Xcode高端必備插件:Injection Plugin for Xcode
直接放demo演示動圖:
我很久以前就希望有這麼一種功能,直接修改某行代碼,F5一下就能刷新這個實例,而不用重寫build整個項目。靠夭,我不是在說前端!
沒想居然有一天,夢想照入現實!!!是的,就是它,不用重新啟動應用就可以讓修改的代碼生效。
使用
超級簡單:修改源碼,按下刷新的快捷鍵ctrl
+=
。會有一個快速的進度條閃過,修改的代碼就**生效了。**
安裝
可以使用Alcatraz安裝
或者clone這個項目,運行InjectionPluginLite/InjectionPlugin.xcodeproj。
檢驗安裝成功
在某個類裡添加下面的方法:
(void)injected{ NSLog(@"I've been injected: %@", self); }
或者swift下:
func injected() { print("I've been injected: (self)") }
打一個斷點在這行代碼上,按下快捷鍵ctrl+=後,代碼執行到這個類時,如果斷點進入這個方法說明你已經安裝成功了。
支持Swift
Swift中的大部分類都可以正常使用。不過以下一些情況使用會有問題:
結構中的修改
標記為final的func和class
不在類裡的全局函數和變量
工作原理
Injection是一個Xcode的擴展插件,可以讓你修改一個類的代碼實現而不用重啟整個應用。
它通過解析應用的build日志來判斷源代碼文件上次是怎麼被編譯的。然後會把這些重新編譯一遍包在一個已經通過動態加載器(dynamic loader)注入到應用的bundle裡。這個時候其實有兩個版本的類在app裡,一個原始的和一個修改過的版本。修改過的版本通過和原始類"swizzled"來產生效果。
swizzling利用了OC的runtime。這個也可以在Swift中沒有標記為final或者private的方法(可以被override的方法)。對結構體無效。
這個插件還可以做點什麼
按照這個文檔操作,還可以支持Storyboard [Storyboard-based iOS projects]
可以可視化的調整顏色 [collection of tunable parameters]
當你開始注入時,會在同一個目錄下生成一個項目文件:iOSInjectionProject 或者 OSXInjectionProject。這個項目用於注入你的修改到原項目。建議加入.gitignore
。
ctrl+=的快捷鍵可以在 "Tunable App Parameters"面板裡自定義
如果想在一台設備上使用,參考這個文檔[patch to your project]
我安裝時遇到的一個錯誤
第一次使用,提示我項目裡使用的一個第三方framework找不到。這個時候打開它自動生成的iOSInjectionProject,編譯一下可以看到錯誤的具體原因。我看到issue裡也好多人遇到。解決方式就是將自己項目framework search paths中的這個第三方框架的路徑拷貝到iOSInjectionProject裡。