1. Mac的App Store上下載安裝InjectionIII.
2. 打開InjectionIII, Open Project, 選擇你的項目目錄.
3. 選擇的項目會在Open Recent中出現, 保持File Watcher的選項勾選.
4. 在AppDelegate的DidFinishLaunchingWithOptions配置InjectionIII的路徑
-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{ //Overridepointforcustomizationafterapplicationlaunch. #ifdefDEBUG //InjectionIII注入 [[NSBundlebundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"]load]; #else #endif returnYES; }
5. 在需要動態調試的頁面控制器中寫上injected方法, 把需要操作的UI方法添加到injected中執行, 如果想讓全部的控制器都能使用, 直接添加到BaseViewController.
//Objective-C: -(void)injected{ #ifdefDEBUG NSLog(@"I'vebeeninjected:%@",self); [selfviewDidLoad]; #endif } //Swift @objcfuncinjected(){ #ifDEBUG print("I'vebeeninjected:(self)") self.viewDidLoad() #endif }
6. 重新編譯項目, 控制臺可以看到
**InjectionIIIconnected/Users/***/Desktop/***/**/***.xcworkspace** **Watchingfilesunder/Users/***/Desktop/**** //下面的只是警告,作者在Issue中已經解釋,不耽誤正常使用. **YourprojectfileseemstobeintheDesktoporDocumentsfolderandmaypreventInjectionIIIworkingasithasspecialpermissions.**
![61114afc-f813-11ed-90ce-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/9B/49/wKgaomTnpXWAUMusAABMZB71rOQ162.jpg)
7. 修改完UI, 直接cmd + S就能看到效果, 部分頁面可能耗時比較久或無法使用, 正常頁面均能使用.
enjoy :)
Flutter Hot Reload介紹
Flutter是Google開發的一個跨平臺開發框架, 調試也是快速實時的.
在Flutter編輯器中修改文字代碼后, 點擊reload, App不用重啟, 模擬器的內容就會立刻改變.
Flutter實現實時編譯的原理
Flutter會在點擊reload時取查看上次編譯以后改動過的代碼, 重新編譯涉及到的代碼庫.
重新編譯過的庫會轉換成內核文件發到Dart VM里, DartVM會重新加載新的內核文件,
加載后會讓Flutter framework觸發所有的Widgets和Render Objects進行重建、重布局、重繪.
Flutter為了能夠支持跨平臺開發, 使用了自研的Dart語言配合在App內集成Dart VM的方式運行Flutter程序.
iOS原生項目擁有Flutter熱重載的原理
Injection for XCode
GitHub地址:
https://github.com/johnno1962/InjectionIII
Injection工具可以動態地將iOS代碼在已運行的程序中執行, 不用重啟.
Injection會監聽源代碼文件的變化, 如果文件被改動了,
Injection Server就會執行rebuildClass重新進行編譯、打包成動態庫.dylib文件,
編譯、打包成動態庫后, 使用writeString方法通過Socket通知運行的App.
-(BOOL)writeString:(NSString*)string{ constchar*utf8=string.UTF8String; uint32_tlength=(uint32_t)strlen(utf8); if(write(clientSocket,&length,sizeoflength)!=sizeoflength|| write(clientSocket,utf8,length)!=length) returnFALSE; returnTRUE; }
Server會在后臺發送和監聽Socket消息, Client也會開啟一個后臺去發送和監聽Socket消息.
Client接收到消息后會調用inject(tmpfile: String)方法, 運行時進行類的動態替換(新類動態替換舊類).
dlopen會把tmpfile動態庫文件載入運行的App里, 返回指針dl.
接下來, dlsym會得到tmpfile動態庫的符號地址, 然后就可以處理類的替換工作了.
當類的方法都被替換后, 我們就可以開始重新繪制界面了.
使用動態庫方式極速調試, 整個過程無需重新編譯和重啟App.
-
iOS
+關注
關注
8文章
3399瀏覽量
150991 -
編譯
+關注
關注
0文章
661瀏覽量
33046 -
flutter
+關注
關注
0文章
13瀏覽量
453
原文標題:僅需 7 步,讓你的 iOS 原生項目擁有 Flutter 熱重載極速調試
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
鴻蒙Flutter實戰:01-搭建開發環境
鴻蒙Flutter實戰:04-如何使用DevTools調試Webview
鴻蒙Flutter實戰:07混合開發
鴻蒙Flutter實戰:08-如何調試代碼
鴻蒙Flutter實戰:11-使用 Flutter SDK 3.22.0
鴻蒙Flutter實戰:12-使用模擬器開發調試
鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II
深入理解flutter的編譯原理與優化
Flutter的 1.0版本正式發布!Flutter是Google為您打造的UI工具包
谷歌現已推出支持 iOS 14 和 Android 11 的最新版 Flutter
Flutter 3.3正式發布
與 Flutter 共創未來 | Flutter Forward 活動精彩回顧
Flutter異步編程指南
Flutter熱更新技術探索
![<b class='flag-5'>Flutter</b><b class='flag-5'>熱</b>更新技術探索](https://file1.elecfans.com/web2/M00/89/5B/wKgZomSBddWAEPUGAAQyS4gZMvY347.png)
評論