iOS原生项目拥有Flutter热重载极速调试

news2024/11/27 4:30:52

1. Mac的App Store上下载安装InjectionIII.

2. 打开InjectionIII, Open Project, 选择你的项目目录.

   

3. 选择的项目会在Open Recent中出现, 保持File Watcher的选项勾选.

4. 在AppDelegate的DidFinishLaunchingWithOptions配置InjectionIII的路径

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
#ifdef DEBUG

    //InjectionIII 注入
    [[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle"] load];

#else

#endif
    return YES;
}

 5. 在需要动态调试的页面控制器中写上injected方法, 把需要操作的UI方法添加到injected中执行, 如果想让全部的控制器都能使用, 直接添加到BaseViewController. 

// Objective-C:
- (void)injected {
    #ifdef DEBUG
        NSLog(@"I've been injected: %@", self);
        [self viewDidLoad];
    #endif    
}


// Swift
@objc func injected() { 
    #if DEBUG 
        print("I've been injected: \(self)")
        self.viewDidLoad() 
    #endif 
}

 6. 重新编译项目, 控制台可以看到

**💉 InjectionIII connected /Users/***/Desktop/***/**/***.xcworkspace**
**💉 Watching files under /Users/***/Desktop/****
// 下面的只是警告, 作者在Issue中已经解释, 不耽误正常使用.
**💉 💉 ⚠️ Your project file seems to be in the Desktop or Documents folder and may prevent InjectionIII working as it has special permissions.**

7. 修改完UI, 直接cmd + S就能看到效果, 部分页面可能耗时比较久或无法使用, 正常页面均能使用.

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 {
    const char *utf8 = string.UTF8String;
    uint32_t length = (uint32_t)strlen(utf8);
    if (write(clientSocket, &length, sizeof length) != sizeof length ||
        write(clientSocket, utf8, length) != length)
        return FALSE;
    return TRUE;
}
  • Server会在后台发送和监听Socket消息, Client也会开启一个后台去发送和监听Socket消息.

  • Client接收到消息后会调用inject(tmpfile: String)方法, 运行时进行类的动态替换(新类动态替换旧类).
     

  • dlopen会把tmpfile动态库文件载入运行的App里, 返回指针dl.

    • 接下来, dlsym会得到tmpfile动态库的符号地址, 然后就可以处理类的替换工作了.

    • 当类的方法都被替换后, 我们就可以开始重新绘制界面了.

    • 使用动态库方式极速调试, 整个过程无需重新编译和重启App.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+django勤工助学管理系统vue

目 录 第1章 绪论 1 1.1课题背景 1 1.2 背景意义 1 1.3 研究的内容 2 第2章 相关技术 3 第3章 系统分析 5 3.1可行性分析 5 3.2系统性能分析 6 3.3系统流程分析 6 3.3.1操作流程 6 3.3.2信息添加流程 7 3.3.3信息删除流程 8 第4章 系统设…

周志华 《机器学习初步》 绪论

周志华 《机器学习初步》 绪论 Datawhale2022年12月组队学习 ✌ 文章目录周志华 《机器学习初步》 绪论一.机器学习二.典型的机器学习过程三.计算学习理论PAC模型思考两个问题问题性质角度计算要求的角度四.基本术语五.归纳偏好六.NFL定理哪个算法更好?NFL定理的寓意…

Codeforces Round #837 (Div. 2) A-C

A. Hossam and Combinatorics A题意: 给你n个数,让你求有多少个数对 并且 满足等于数组中最大的绝对值之差。 思路:直接找最大值和最小值,如果最大值和最小值不是一个,那就是最大数的数量乘最小值的数量乘2&#x…

前端基础(一)_前端页面构成

一、前端页面构成 1.HTML(Hypertext Markup Language) Html–超文本标记语言, 结构层由HTML标记语言创建的,负责页面的语义。(它包括一系列标签,主要分为块标签和行标签、行内块标签三类) 2.CSS(Cascading style sh…

绿色中国馆设计

目 录 1工程概况 1 1.1建筑设计部分 1 1.1.1设计依据 1 1.1.2设计内容、建筑面积、标高 1 1.1.3建筑空间构成 1 1.1.4采光和通风 1 1.1.5防火及安全 2 1.1.6各部分工程构造 2 1.2 结构设计部分 3 1.2.1基本资料 3 1.2.2结构形式和基础形式 3 1.2.3结构尺寸及采用的材料 4 1.2.4…

[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理

放入路径 回忆上次内容 上次总算可以把 sleep.py 直接执行了 sleep.py文件头部要声明好打开方式 #!/usr/bin/python3用的是 python3 解释 sleep.py 修改 sleep.py 文件 的执行权限 给当前用户增加 执行execute 权限 chmod ux sleep.py 运行./sleep.py成功 但我不想总带着当前路…

[附源码]Python计算机毕业设计SSM基于web的网上订餐系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Ubuntu18.04安装Carla 记录

官方文档:CARLA Simulator 方式一:简单快速安装,该方式有缺陷。需要使用虚幻引擎编辑器的高级定制和开发选项不可用。 Advanced customization and development options that require use of the Unreal Engine editor are not available b…

【编译原理】第三章部分课后题答案

第 三 章 课 后 习 题 T 3.1 考虑文法 S→(L)∣aL→L,S∣SS \rightarrow (L)\space | \space a\\ L\rightarrow L, S \space | \space S S→(L) ∣ aL→L,S ∣ S (a) 建立句子 (a,(a,a))(a,(a,a))(a,(a,a)) 和 (a,(a,a),(a,a))(a,(a,a),(a,a))(a,(a,a),(a,a)) 的分析树。 见…

SpringMVC学习:三、SpringMVC的请求与响应

4. SpringMVC的请求与响应 4.1 RequestMapping ​ 使用RequestMapping注解可以定义不同的处理器映射规则。 1. URL路径映射: RequestMapping(value“/queryAll”)或RequestMapping("/queryAll”) value的值是数组,可以将多个url映射到同一个方法…

计算机研究生就业方向之互联网安全

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么,如果你只是转码,那么你不一定要考研,至少以下几个职位研究生是没有啥优势的: 1,软件测试工程师(培训一下就行) 2,前…

CSS 居中总结

文章目录CSS 居中总结水平居中文字水平居中块元素水平居中行内元素和行内块元素水平居中垂直居中文字垂直居中单行文字多行文字块元素居中块元素居中(方法二)块元素居中(方法三)行内元素、行内块元素居中flex居中CSS 居中总结 水…

web前端期末大作业实例 (1500套) 集合

文章目录📚web前端期末大作业 (1500套) 集合一、网页介绍二、网页集合💌表白网页 125套 (集合)💙Echarts大屏数据展示 150套 (集合)一、基于HTMLEcharts技术制作二、基于VUEEcharts技术制作🎁更多源码📚web前端期末大作…

去中心化的互联网环境,有一种神奇的商业模式,无产品也可以创业

现在的电商行业做分销的平台越来越多,竞争力也越渐增大,不得不使用一些电商商业模式来让用户进来并留下来。 ​ 但是在经济环境和疫情环境的双重影响下,每个人或多或少都被影响到了。虽然有很多行业低落,但是也有一些行业兴起&…

Spring事务及Spring整合MyBatis

SM整合的步骤 1,建库建表 2,新建maven模块 3,修改maven目录 4,修改pom.xml文件,添加依赖 5,添加MyBaits模板(SqlMapperConfig.xml和XXXMapper.xml文件) 6,添加Appli…

小程序中的轮播图

目录 小程序的宿主环境 - 组件 1.scroll-view 组件的基本使用2.swiper 和 swiper-item 组件的基本使用3.text 组件的基本使用4.rich-text 组件的基本使用附:微信小程序轮播图单独添加图片、修改轮播图图片、单独修改某张图片总结 小程序的宿主环境 - 组件 1.scrol…

北京智和信通:交换机策略查询与自动化配置

在网络中交换机占据重要位置,一旦交换机被攻击或破坏,都将使整个网络处于危险之中。在网络的日常配置管理中,交换机的配置也是核心工作,但在交换机的配置过程复杂,而且根据品牌及型号的不同,配置方式也不相…

利用2阶分数阶微分掩模的边缘检测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

java计算机毕业设计基于安卓Android的装维助手APP

项目介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于装维助手APP当然也不能排除在外,随着网络技术的不断成熟,带动了装维助手APP,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性…

服务器负载过高实例分析

一、问题现象 top 命令查看显示服务器负载情况,服务器负载1.31,而且长时间没降下去,CPU使用率99.9%也异常飚高 load average :系统平均负载均值,三列分别代表 1分钟、5分钟、15分钟。理论上,值越小越好。负…