今天強(qiáng)烈推薦一個(gè)Xcode高端必備插件: Injection Plugin for Xcode
直接放demo演示動(dòng)圖:
我很久以前就希望有這么一種功能,直接修改某行代碼赡盘,F(xiàn)5一下就能刷新這個(gè)實(shí)例扯旷,而不用重寫build整個(gè)項(xiàng)目》岣瑁靠夭议蟆,我不是在說(shuō)前端婚温!
沒(méi)想居然有一天锡宋,夢(mèng)想照入現(xiàn)實(shí)@芡濉!执俩!是的徐钠,就是它,不用重新啟動(dòng)應(yīng)用就可以讓修改的代碼生效役首。
使用
超級(jí)簡(jiǎn)單:修改源碼尝丐,按下刷新的快捷鍵<code>ctrl</code>+<code>=</code>。會(huì)有一個(gè)快速的進(jìn)度條閃過(guò)衡奥,修改的代碼就生效了爹袁。
安裝
- 可以使用Alcatraz安裝
- 或者clone這個(gè)項(xiàng)目,運(yùn)行InjectionPluginLite/InjectionPlugin.xcodeproj矮固。
檢驗(yàn)安裝成功
在某個(gè)類里添加下面的方法:
<pre><code>
-
(void)injected{
NSLog(@"I've been injected: %@", self);
}
</code></pre>
或者swift下:
<pre><code>
func injected() {
print("I've been injected: (self)")
}
</code></pre>
打一個(gè)斷點(diǎn)在這行代碼上失息,按下快捷鍵ctrl+=后,代碼執(zhí)行到這個(gè)類時(shí)档址,如果斷點(diǎn)進(jìn)入這個(gè)方法說(shuō)明你已經(jīng)安裝成功了盹兢。
支持Swift
Swift中的大部分類都可以正常使用。不過(guò)以下一些情況使用會(huì)有問(wèn)題:
- 結(jié)構(gòu)中的修改
- 標(biāo)記為final的func和class
- 不在類里的全局函數(shù)和變量
工作原理
Injection是一個(gè)Xcode的擴(kuò)展插件守伸,可以讓你修改一個(gè)類的代碼實(shí)現(xiàn)而不用重啟整個(gè)應(yīng)用绎秒。
它通過(guò)解析應(yīng)用的build日志來(lái)判斷源代碼文件上次是怎么被編譯的。然后會(huì)把這些重新編譯一遍包在一個(gè)已經(jīng)通過(guò)動(dòng)態(tài)加載器(dynamic loader)注入到應(yīng)用的bundle里含友。這個(gè)時(shí)候其實(shí)有兩個(gè)版本的類在app里替裆,一個(gè)原始的和一個(gè)修改過(guò)的版本。修改過(guò)的版本通過(guò)和原始類"swizzled"來(lái)產(chǎn)生效果窘问。
swizzling利用了OC的runtime辆童。這個(gè)也可以在Swift中沒(méi)有標(biāo)記為final或者private的方法(可以被override的方法)。對(duì)結(jié)構(gòu)體無(wú)效惠赫。
這個(gè)插件還可以做點(diǎn)什么
- 按照這個(gè)文檔操作把鉴,還可以支持Storyboard Storyboard-based iOS projects.
- 也可以可視化的調(diào)整顏色 collection of tunable parameters
- 當(dāng)你開始注入時(shí),會(huì)在同一個(gè)目錄下生成一個(gè)項(xiàng)目文件:iOSInjectionProject 或者 OSXInjectionProject儿咱。這個(gè)項(xiàng)目用于注入你的修改到原項(xiàng)目庭砍。建議加入<code>.gitignore</code>。
- ctrl+=的快捷鍵可以在 "Tunable App Parameters"面板里自定義
- 如果想在一臺(tái)設(shè)備上使用混埠,參考這個(gè)文檔patch to your project..
我安裝時(shí)遇到的一個(gè)錯(cuò)誤
第一次使用怠缸,提示我項(xiàng)目里使用的一個(gè)第三方framework找不到。這個(gè)時(shí)候打開它自動(dòng)生成的iOSInjectionProject钳宪,編譯一下可以看到錯(cuò)誤的具體原因揭北。我看到issue里也好多人遇到扳炬。解決方式就是將自己項(xiàng)目framework search paths中的這個(gè)第三方框架的路徑拷貝到iOSInjectionProject里。
歡迎關(guān)注我的微博:@沒(méi)故事的卓同學(xué)