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

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

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

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

Android編程精選 ? 來(lái)源:Android編程精選 ? 2023-05-22 10:01 ? 次閱讀

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

2. 打開(kāi)InjectionIII, Open Project, 選擇你的項(xiàng)目目錄.

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

3. 選擇的項(xiàng)目會(huì)在Open Recent中出現(xiàn), 保持File Watcher的選項(xiàng)勾選.

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. 在需要?jiǎng)討B(tài)調(diào)試的頁(yè)面控制器中寫(xiě)上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. 重新編譯項(xiàng)目, 控制臺(tái)可以看到

**InjectionIIIconnected/Users/***/Desktop/***/**/***.xcworkspace**
**Watchingfilesunder/Users/***/Desktop/****
//下面的只是警告,作者在Issue中已經(jīng)解釋,不耽誤正常使用.
**YourprojectfileseemstobeintheDesktoporDocumentsfolderandmaypreventInjectionIIIworkingasithasspecialpermissions.**
61114afc-f813-11ed-90ce-dac502259ad0.jpg
7. 修改完UI, 直接cmd + S就能看到效果, 部分頁(yè)面可能耗時(shí)比較久或無(wú)法使用, 正常頁(yè)面均能使用.

enjoy :)

Flutter Hot Reload介紹

Flutter是Google開(kāi)發(fā)的一個(gè)跨平臺(tái)開(kāi)發(fā)框架, 調(diào)試也是快速實(shí)時(shí)的.

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

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

Flutter會(huì)在點(diǎn)擊reload時(shí)取查看上次編譯以后改動(dòng)過(guò)的代碼, 重新編譯涉及到的代碼庫(kù).

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

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

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

iOS原生項(xiàng)目擁有Flutter熱重載的原理

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

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

Injection會(huì)監(jiān)聽(tīng)源代碼文件的變化, 如果文件被改動(dòng)了,

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

編譯、打包成動(dòng)態(tài)庫(kù)后, 使用writeString方法通過(guò)Socket通知運(yùn)行的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會(huì)在后臺(tái)發(fā)送和監(jiān)聽(tīng)Socket消息, Client也會(huì)開(kāi)啟一個(gè)后臺(tái)去發(fā)送和監(jiān)聽(tīng)Socket消息.

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

dlopen會(huì)把tmpfile動(dòng)態(tài)庫(kù)文件載入運(yùn)行的App里, 返回指針dl.

接下來(lái), dlsym會(huì)得到tmpfile動(dòng)態(tài)庫(kù)的符號(hào)地址, 然后就可以處理類(lèi)的替換工作了.

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

使用動(dòng)態(tài)庫(kù)方式極速調(diào)試, 整個(gè)過(guò)程無(wú)需重新編譯和重啟App.

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

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

    關(guān)注

    8

    文章

    3392

    瀏覽量

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

    關(guān)注

    0

    文章

    648

    瀏覽量

    32774
  • flutter
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    432

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

    前提 開(kāi)發(fā)電腦需為M系列芯片 (ARM架構(gòu)) 的 Mac 電腦 目前 Flutter 鴻蒙開(kāi)發(fā),無(wú)法使用 X86 架構(gòu)的模擬器,只能使用 ARM 架構(gòu)的模擬器** 創(chuàng)建項(xiàng)目 等開(kāi)發(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)被廣泛用于多個(gè)產(chǎn)品,比如 Google Ads 已經(jīng)將其產(chǎn)品的 iOS 版本和 Android 版本轉(zhuǎn)向使用 Flutter。在正式版本之前,全世界已經(jīng)有
    的頭像 發(fā)表于 12-07 11:09 ?5411次閱讀

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

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

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

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

    Flutter 3.3正式發(fā)布

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

    Flutter 共創(chuàng)未來(lái) | Flutter Forward 活動(dòng)精彩回顧

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

    Flutter異步編程指南

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

    Flutter更新技術(shù)探索

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