最終效果: 代碼在保存以後,立馬在模擬器上看到修改後的效果, 避免Command+R從新編譯耗費時間的問題; 若是APP頁面層級太深的話,傳統調試要一步步點進到指定頁面,使用該方案直接就能看到效果,所見即所得,👏👏👏xcode
每次都被咱們項目的編譯速度整的快沒脾氣了,一直想着優化項目的編譯速度。 想一想以前作的RN項目的熱部署效果然的很爽,不爽之餘想到:他用個雜交品種能熱部署,而我用蘋果親兒子沒道理不行啊!能不能搞個runtime之類的跟新啊。 人有多大膽,地有多大產;不怕辦不到,就怕想不到。終於找到了這個成噸減小工做量的方案。bash
超級簡單,只有三步: 一、一個工具 二、選定項目目錄 三、把一個文件放到項目中app
無需其餘任何配置,不對項目結構形成任何侵害。工具
InjectionIII 是咱們須要用到個一個工具,不要由於要用一個工具而厭煩這個方案,它很簡單。 它是免費的,app store 搜索:InjectionIII,Icon是 一個針筒。 也是開源的,
GitHub連接: github.com/johnno1962/…
App Store連接: https://itunes.apple.com/cn/app/injectioniii/id1380446739?mt=12優化
打開InjectionIII工具,選擇Open Project,選擇你的代碼所在的路徑,而後點擊Select Project Directory保存。spa
注意:InjectionIII 的File Watcher選項要保持選中狀態。調試
這步我簡單寫了一個配置文件,直接 GitHub下載 導入項目便可。 若是你比較反感下載文件也能夠本身處理: 1.設置AppDelegate.m 打開你的源碼,在AppDelegate.m的didFinishLaunchingWithOptions方法添加一行代碼:code
#if DEBUG
// iOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle"] load];
// tvOS
//[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/tvOSInjection.bundle"] load];
// macOS
//[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle"] load];
#endif
複製代碼
2.設置ViewController 在須要修改界面的ViewController添加方法- (void)injected,或者給ViewController類擴展添加方法- (void)injected。 全部修改控件的代碼都寫在這裏面。
- (void)injected
{
//自定義修改...
//從新加載view
[self viewDidLoad];
}
複製代碼
在Xcode Command+R運行項目 ,看到Injection connected 提示即表示配置成功。
在須要修改的頁面,修改控件UI,而後Command+S保存一下代碼,馬上就在模擬器上顯示修改的信息了。
工具使用中若有問題能夠參考github上的過往經驗,也歡迎留言咱們一塊兒討論。 工具git地址:github.com/johnno1962/…
用runtime 給每一個VC加個方法class_addMethod
依託InjectionIII的iOS熱部署配置文件,無侵害,導入即用。
@implementation InjectionIIIHelper
#if DEBUG
/**
InjectionIII 熱部署會調用的一個方法,
runtime給VC綁定上以後,每次部署完就從新viewDidLoad
*/
void injected (id self, SEL _cmd) {
//從新加載view
[self loadView];
[self viewDidLoad];
[self viewWillLayoutSubviews];
[self viewWillAppear:NO];
}
+ (void)load
{
//註冊項目啓動監聽
__block id observer =
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
//更改bundlePath
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle"] load];
//[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
//給UIViewController 註冊injected 方法
class_addMethod([UIViewController class], NSSelectorFromString(@"injected"), (IMP)injected, "v@:");
}
#endif
@end
複製代碼