RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

iOS如何擁有 Flutter 熱重載極速調(diào)試

Android編程精選 ? 來源:Android編程精選 ? 2023-05-22 10:01 ? 次閱讀

1. Mac的App Store上下載安裝InjectionIII.

2. 打開InjectionIII, Open Project, 選擇你的項目目錄.

60fef6f4-f813-11ed-90ce-dac502259ad0.jpg

3. 選擇的項目會在Open Recent中出現(xiàn), 保持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. 在需要動態(tài)調(diào)試的頁面控制器中寫上injected方法, 把需要操作的UI方法添加到injected中執(zhí)行, 如果想讓全部的控制器都能使用, 直接添加到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中已經(jīng)解釋,不耽誤正常使用.
**YourprojectfileseemstobeintheDesktoporDocumentsfolderandmaypreventInjectionIIIworkingasithasspecialpermissions.**
61114afc-f813-11ed-90ce-dac502259ad0.jpg
7. 修改完UI, 直接cmd + S就能看到效果, 部分頁面可能耗時比較久或無法使用, 正常頁面均能使用.

enjoy :)

Flutter Hot Reload介紹

Flutter是Google開發(fā)的一個跨平臺開發(fā)框架, 調(diào)試也是快速實時的.

在Flutter編輯器中修改文字代碼后, 點擊reload, App不用重啟, 模擬器的內(nèi)容就會立刻改變.

Flutter實現(xiàn)實時編譯的原理

Flutter會在點擊reload時取查看上次編譯以后改動過的代碼, 重新編譯涉及到的代碼庫.

重新編譯過的庫會轉(zhuǎn)換成內(nèi)核文件發(fā)到Dart VM里, DartVM會重新加載新的內(nèi)核文件,

加載后會讓Flutter framework觸發(fā)所有的Widgets和Render Objects進(jìn)行重建、重布局、重繪.

Flutter為了能夠支持跨平臺開發(fā), 使用了自研的Dart語言配合在App內(nèi)集成Dart VM的方式運行Flutter程序.

iOS原生項目擁有Flutter熱重載的原理

Injection for XCode
GitHub地址:
https://github.com/johnno1962/InjectionIII

Injection工具可以動態(tài)地將iOS代碼在已運行的程序中執(zhí)行, 不用重啟.

Injection會監(jiān)聽源代碼文件的變化, 如果文件被改動了,

Injection Server就會執(zhí)行rebuildClass重新進(jìn)行編譯、打包成動態(tài)庫.dylib文件,

編譯、打包成動態(tài)庫后, 使用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會在后臺發(fā)送和監(jiān)聽Socket消息, Client也會開啟一個后臺去發(fā)送和監(jiān)聽Socket消息.

Client接收到消息后會調(diào)用inject(tmpfile: String)方法, 運行時進(jìn)行類的動態(tài)替換(新類動態(tài)替換舊類).

dlopen會把tmpfile動態(tài)庫文件載入運行的App里, 返回指針dl.

接下來, dlsym會得到tmpfile動態(tài)庫的符號地址, 然后就可以處理類的替換工作了.

當(dāng)類的方法都被替換后, 我們就可以開始重新繪制界面了.

使用動態(tài)庫方式極速調(diào)試, 整個過程無需重新編譯和重啟App.

6126d0ca-f813-11ed-90ce-dac502259ad0.jpg

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • iOS
    iOS
    +關(guān)注

    關(guān)注

    8

    文章

    3395

    瀏覽量

    150564
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    657

    瀏覽量

    32852
  • flutter
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    441

原文標(biāo)題:僅需 7 步,讓你的 iOS 原生項目擁有 Flutter 熱重載極速調(diào)試

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙Flutter實戰(zhàn):01-搭建開發(fā)環(huán)境

    ; 如果要適配ios,需要安裝Xcode Mac 安裝(推薦) 環(huán)境變量配置 # Flutter Mirror export PUB_HOSTED_URL=https
    發(fā)表于 10-21 19:35

    鴻蒙Flutter實戰(zhàn):04-如何使用DevTools調(diào)試Webview

    # 鴻蒙 Flutter 如何使用 DevTools 調(diào)試 Webview 在《鴻蒙 Flutter 開發(fā)中集成 Webview》,介紹了如果在 Flutter 中集成 Webvie
    發(fā)表于 10-22 21:53

    鴻蒙Flutter實戰(zhàn):07混合開發(fā)

    。 其優(yōu)點是主項目開發(fā)者可以不關(guān)注Flutter實現(xiàn),不需要安裝配置Flutter開發(fā)環(huán)境,缺點是無法及時修改Flutter代碼,也不存在重載
    發(fā)表于 10-23 16:00

    鴻蒙Flutter實戰(zhàn):08-如何調(diào)試代碼

    # 鴻蒙Flutter實戰(zhàn):如何調(diào)試代碼 ## 1.環(huán)境搭建 參考文章[鴻蒙Flutter實戰(zhàn):01-搭建開發(fā)環(huán)境](https://gitee.com/zacks
    發(fā)表于 10-23 16:29

    鴻蒙Flutter實戰(zhàn):09-現(xiàn)有Flutter項目支持鴻蒙

    /path_provider\" 編譯運行 運行 Flutter 項目,查看相關(guān)日志和運行界面,針對出現(xiàn)的問題再單獨處理。 查看日志,可以在運行Flutter處的IDE調(diào)試控制臺查看 Flu
    發(fā)表于 10-23 16:36

    鴻蒙Flutter實戰(zhàn):11-使用 Flutter SDK 3.22.0

    # 使用 Flutter SDK 3.22.0 ## SDK 安裝 參考[鴻蒙Flutter實戰(zhàn):01-搭建開發(fā)環(huán)境]文章的說明,首先安裝 Flutter SDK 3.22.0。 目前鴻蒙化
    發(fā)表于 11-01 15:03

    鴻蒙Flutter實戰(zhàn):12-使用模擬器開發(fā)調(diào)試

    前提 開發(fā)電腦需為M系列芯片 (ARM架構(gòu)) 的 Mac 電腦 目前 Flutter 鴻蒙開發(fā),無法使用 X86 架構(gòu)的模擬器,只能使用 ARM 架構(gòu)的模擬器** 創(chuàng)建項目 等開發(fā)環(huán)境搭建
    發(fā)表于 11-10 13:13

    深入理解flutter的編譯原理與優(yōu)化

    差別,關(guān)系如何,又是如何嵌入Android/iOS的呢?Flutter的渲染和事件傳遞機(jī)制如何工作?Flutter支持更新嗎?Flutter
    發(fā)表于 07-02 17:47

    Flutter的 1.0版本正式發(fā)布!Flutter是Google為您打造的UI工具包

    在 Google 內(nèi)部,Flutter 已經(jīng)被廣泛用于多個產(chǎn)品,比如 Google Ads 已經(jīng)將其產(chǎn)品的 iOS 版本和 Android 版本轉(zhuǎn)向使用 Flutter。在正式版本之前,全世界已經(jīng)有
    的頭像 發(fā)表于 12-07 11:09 ?5437次閱讀

    谷歌現(xiàn)已推出支持 iOS 14 和 Android 11 的最新版 Flutter

    谷歌現(xiàn)已推出支持 iOS 14 和 Android 11 的最新版 Flutter。全新 Flutter 1.22 距 1.20 版本發(fā)布僅有兩個月時間。
    的頭像 發(fā)表于 10-11 10:54 ?1902次閱讀

    原生開發(fā)如何學(xué)習(xí)Flutter

    給原生 Android/ iOS 開發(fā)介紹如何正確學(xué)習(xí)和使用 Flutter
    的頭像 發(fā)表于 02-18 18:43 ?1730次閱讀

    Flutter 3.3正式發(fā)布

    Impeller 是對 Flutter Engine 核心部分的一次重大重寫,使用一個定制的運行時環(huán)境來取代 Skia 代碼,并充分利用現(xiàn)代的硬件加速的圖形 API,如 iOS 上的 Metal 和 Android 上的 Vulkan。
    的頭像 發(fā)表于 09-06 10:49 ?815次閱讀

    Flutter 共創(chuàng)未來 | Flutter Forward 活動精彩回顧

    作者 / Google 開發(fā)者框架和語言 (含 Flutter、Dart 和 Go) 產(chǎn)品經(jīng)理 用戶體驗總監(jiān) Tim Sneath 我們很高興可以在 Flutter Forward 活動 上分享我們
    的頭像 發(fā)表于 02-22 23:20 ?587次閱讀

    Flutter異步編程指南

    在 App 開發(fā)中,經(jīng)常會遇到處理異步任務(wù)的場景,如網(wǎng)絡(luò)請求、讀寫文件等。Android、iOS 使用的是多線程,而在 Flutter 中為單線程事件循環(huán),如下圖所示。
    的頭像 發(fā)表于 04-13 10:06 ?585次閱讀

    Flutter更新技術(shù)探索

    APP 發(fā)布到市場后,難免會遇到嚴(yán)重的 BUG 阻礙用戶使用,因此有在不發(fā)布新版本 APP 的情況下使用更新技術(shù)立即修復(fù) BUG 需求。原生 APP(例如:Android & IOS)的
    的頭像 發(fā)表于 06-08 14:31 ?1051次閱讀
    <b class='flag-5'>Flutter</b><b class='flag-5'>熱</b>更新技術(shù)探索
    RM新时代网站-首页