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

    文章

    3395

    浏览量

    150587
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32867
  • flutter
    +关注

    关注

    0

    文章

    13

    浏览量

    441

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

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

收藏 人收藏

    评论

    相关推荐

    鸿蒙Flutter实战:01-搭建开发环境

    ; 如果要适配ios,需要安装Xcode Mac 安装(推荐) 环境变量配置 # Flutter Mirror export PUB_HOSTED_URL=https
    发表于 10-21 19:35

    鸿蒙Flutter实战:04-如何使用DevTools调试Webview

    # 鸿蒙 Flutter 如何使用 DevTools 调试 Webview 在《鸿蒙 Flutter 开发中集成 Webview》,介绍了如果在 Flutter 中集成 Webvie
    发表于 10-22 21:53

    鸿蒙Flutter实战:07混合开发

    。 其优点是主项目开发者可以不关注Flutter实现,不需要安装配置Flutter开发环境,缺点是无法及时修改Flutter代码,也不存在重载
    发表于 10-23 16:00

    鸿蒙Flutter实战:08-如何调试代码

    # 鸿蒙Flutter实战:如何调试代码 ## 1.环境搭建 参考文章[鸿蒙Flutter实战:01-搭建开发环境](https://gitee.com/zacks
    发表于 10-23 16:29

    鸿蒙Flutter实战:09-现有Flutter项目支持鸿蒙

    /path_provider\" 编译运行 运行 Flutter 项目,查看相关日志和运行界面,针对出现的问题再单独处理。 查看日志,可以在运行Flutter处的IDE调试控制台查看 Flu
    发表于 10-23 16:36

    鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0

    # 使用 Flutter SDK 3.22.0 ## SDK 安装 参考[鸿蒙Flutter实战:01-搭建开发环境]文章的说明,首先安装 Flutter SDK 3.22.0。 目前鸿蒙化
    发表于 11-01 15:03

    鸿蒙Flutter实战:12-使用模拟器开发调试

    前提 开发电脑需为M系列芯片 (ARM架构) 的 Mac 电脑 目前 Flutter 鸿蒙开发,无法使用 X86 架构的模拟器,只能使用 ARM 架构的模拟器** 创建项目 等开发环境搭建
    发表于 11-10 13:13

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

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

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

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

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

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

    原生开发如何学习Flutter

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

    Flutter 3.3正式发布

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

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

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

    Flutter异步编程指南

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

    Flutter更新技术探索

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