0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

iOS如何拥有 Flutter 热重载极速调试

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中出现, 保持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
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.

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

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • iOS
    iOS
    +关注

    关注

    8

    文章

    3357

    浏览量

    149520
  • 编译
    +关注

    关注

    0

    文章

    628

    浏览量

    32523
  • flutter
    +关注

    关注

    0

    文章

    12

    浏览量

    407

原文标题:仅需 7 步,让你的 iOS 原生项目拥有 Flutter 热重载极速调试

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深入理解flutter的编译原理与优化

    差别,关系如何,又是如何嵌入Android/iOS的呢?Flutter的渲染和事件传递机制如何工作?Flutter支持更新吗?Flutter
    发表于 07-02 17:47

    Flutter框架相关资料下载

    作者: Flutter 团队I/O 期间我们迎来 Flutter 框架的一个重要里程碑,因为我们的开发重点从移动平台扩展到了更广泛的设备和机型。在 I/O 大会上,我们发...
    发表于 12-16 08:06

    Flutter的 1.0版本正式发布!Flutter是Google为您打造的UI工具包

    在 Google 内部,Flutter 已经被广泛用于多个产品,比如 Google Ads 已经将其产品的 iOS 版本和 Android 版本转向使用 Flutter。在正式版本之前,全世界已经有
    的头像 发表于 12-07 11:09 5306次阅读

    维安达斯极速调试模式微波对射成功上市

    ,于2018年底强势推出拥有完全自主知识产权的带极速调试模式的全数字微波对射探测器。维安达斯微波对射探测器一经推出,以其超远探测距离和极具威压之势的盾型外观,以及充满人性关怀的极速
    发表于 03-25 17:00 603次阅读

    谷歌现已推出支持 iOS 14 和 Android 11 的最新版 Flutter

    谷歌现已推出支持 iOS 14 和 Android 11 的最新版 Flutter。全新 Flutter 1.22 距 1.20 版本发布仅有两个月时间。
    的头像 发表于 10-11 10:54 1725次阅读

    Flutter的一些技巧

    文章目录 前言 转变思维 命令式 声明式 结论 总结 前言 Flutter 近两年在江湖上崛起的非常迅猛,业已成为移动开发中不的不重视的一股力量。如果你是一个有追求的IOS/Android程序员
    的头像 发表于 02-12 11:46 1887次阅读
    <b class='flag-5'>Flutter</b>的一些技巧

    原生开发如何学习Flutter

    给原生 Android/ iOS 开发介绍如何正确学习和使用 Flutter
    的头像 发表于 02-18 18:43 1585次阅读

    Flutter Go Flutter学习App

    ./oschina_soft/flutter-go.zip
    发表于 06-23 09:21 0次下载
    <b class='flag-5'>Flutter</b> Go <b class='flag-5'>Flutter</b>学习App

    Flutter 3.3正式发布

    Impeller 是对 Flutter Engine 核心部分的一次重大重写,使用一个定制的运行时环境来取代 Skia 代码,并充分利用现代的硬件加速的图形 API,如 iOS 上的 Metal 和 Android 上的 Vulkan。
    的头像 发表于 09-06 10:49 673次阅读

    Flutter 共创未来 | Flutter Forward 活动精彩回顾

    作者 / Google 开发者框架和语言 (含 Flutter、Dart 和 Go) 产品经理 用户体验总监 Tim Sneath 我们很高兴可以在 Flutter Forward 活动 上分享我们
    的头像 发表于 02-22 23:20 446次阅读

    Flutter异步编程指南

    在 App 开发中,经常会遇到处理异步任务的场景,如网络请求、读写文件等。Android、iOS 使用的是多线程,而在 Flutter 中为单线程事件循环,如下图所示。
    的头像 发表于 04-13 10:06 411次阅读

    Flutter热更新技术探索

    APP 发布到市场后,难免会遇到严重的 BUG 阻碍用户使用,因此有在不发布新版本 APP 的情况下使用热更新技术立即修复 BUG 需求。原生 APP(例如:Android & IOS
    的头像 发表于 06-08 14:31 678次阅读
    <b class='flag-5'>Flutter</b>热更新技术探索

    社区说 | 精益求精: Flutter 技巧专题篇

    Flutter 作为深受欢迎的跨平台开发框架,迄今为止已有超过 70 万款使用 Flutter 打造的应用上架。开源生态社区更是有超过 20% 的中国开发者作出贡献。 本次 Flutter 专题
    的头像 发表于 07-25 17:45 343次阅读
    社区说 | 精益求精: <b class='flag-5'>Flutter</b> 技巧专题篇

    如何在Torizon平台使用Flutter来开发用户界面

    Google 面向 Android, iOS 推出的跨平台移动应⽤开发框架 Flutter 可以构建高质量的原⽣⽤户界⾯,并可以扩展支持 Web 和桌面应用。Flutter 尚未官方支持嵌入式系统,但目前 Sony 和 Ubun
    发表于 12-07 10:39 257次阅读
    如何在Torizon平台使用<b class='flag-5'>Flutter</b>来开发用户界面

    浅谈兼容 OpenHarmony 的 Flutter

    OpenHarmony SIG 组织在 Gitee 开源了兼容 OpenHarmony 的 Flutter。该组织主要用于孵化 OpenHarmony 相关的开源生态项目。     ▲ 仓库地址
    的头像 发表于 02-02 15:22 352次阅读
    浅谈兼容 OpenHarmony 的 <b class='flag-5'>Flutter</b>