《突破自我:2023年度总结与展望》

news/2024/7/20 22:44:46 标签: ios, swift

文章目录

    • 引言:
    • 回顾过去一年的亮点:
    • 面对的挑战及解决方案:
      • JSBridge原理
        • 原理介绍
        • 实现流程
          • 实现思路
          • 第一步:设计出一个Native与JS交互的全局桥梁对象
          • 第二步: JS如何调用native
          • 第三步:Native如何得知api被调用
          • 第四步:分析url-参数和回调格式
          • 第五步:Native调用JS
        • 完整的流程图
          • 原生主动调用H5方法:
          • H5主动调用原生方法:
    • 学到的教训:
    • 技能和知识的提升:
    • 感悟和总结:
    • 鼓励交流:

引言:

在过去的一年里,我经历了许多挑战和喜悦,从中学到了许多宝贵的经验,通过这篇征文,我希望能够分享我的成长历程,同时也期待读者在新的一年里有更好的收获和突破

回顾过去一年的亮点:

在2023年,成功的领导了开发小团队完成了一项重要的新项目开发,实现从0到1。同时,在各个项目迭代中,担任主要负责人,梳理需求,编写技术文档,高效完成项目的同时,也提高自身的梳理逻辑以及理解能力。
使用组件库开发模式,实现项目模块解耦。

面对的挑战及解决方案:

尽管在项目中遇到了原生与前端使用JSBridge多方案交互兼容的问题,但通过个人思考优化方案,最终输出兼容多套JSBridge注入方法的方式,我们最终解决了该问题。

JSBridge原理

原理介绍

JSBridge是Native代码与JS代码的通信桥梁,目前的一种统一方案是:H5触发url scheme -> Native捕获url scheme -> 原生分析、执行 -> 原生调用h5。如下图:
在这里插入图片描述

实现流程
实现思路
  1. 设计Native与JS交互的全局桥梁
  2. JS如何调用Native
  3. Native如何得知api被调用
  4. 分析url-参数和回调格式
  5. Native调用JS
第一步:设计出一个Native与JS交互的全局桥梁对象

JS和Native之间的通信需要一个H5全局对象JSBridge来实现,该对象有如下特点:

  • 该对象名为JSBridge,是h5页面中的全局对象window的一个属性
  • 该对象有如下方法:
    • registerHandler(String,Function) :H5调用,注册本地JS方法,注册后Native可通过JSBridge调用。调用后会将方法注册到本地变量messageHandlers 中
    • callHandler(String,JSON,Function) :H5调用,调用原生开放的api,调用后实际上还是本地通过url scheme触发。调用时会将回调id存放到本地变量responseCallbacks中
    • _handleMessageFromObjc(JSON): Native调用,原生调用H5页面注册的方法,或者通知H5页面执行回调方法
第二步: JS如何调用native

在第一步中,我们定义好了全局桥对象,所以前端是通过它的callHandler方法来调用原生的,在前端页面,执行callHandler时,会判断是否有回调函数

  • 如果有,则对应生成一个回调函数id,保存在一个回调函数集合中
  • 然后将消息通过_doSend()方法添加到一个消息数组sendMessageQueue中,然后通过设置messageIframe.src

注意:正常来说是可以通过window.location.href达到发起网络请求的效果的,但是有一个很严重的问题,就是如果我们连续多次修改window.location.href的值,在Native层只能接收到最后一次请求,前面的请求都会被忽略掉。所以JS端发起网络请求的时候,需要使用iframe,这样就可以避免这个问题。

第三步:Native如何得知api被调用

在上一步中,我们已经成功在h5页面中出发messageIframe.src,设置这个会触发Webview的代理回调方法:
webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
原生通过拦截url为约定的url,执行原生的核心代码

第四步:分析url-参数和回调格式

在第三步中,Native已经接收到了JS调用的方法,然后通过执行WebViewJavascriptBridge._fetchQueue()方法获取第二步中的sendMessageQueue的json数据,解析该json数据获取方法名、参数以及回调函数等,原生本地执行对应的api功能方法逻辑,方法执行完毕,再根据该方法的回调函数id和回调内容,组装成一个json格式的参数,回调给H5,参考第五步

第五步:Native调用JS

原生组装好回调给h5的数据,通过调用WebViewJavascriptBridge._handleMessageFromObjC('\(messsageJson)')方法,传递给H5,到此就是JS调用原生的方法的整个流程了

所以整个的流程可以简约为:
H5调用Native -> 将所有参数存入本地数组 -> 触发一个固定的url scheme -> 原生捕获scheme -> 原生通过JSBridge主动获取参数 -> 进行分析

完整的流程图
原生主动调用H5方法:

在这里插入图片描述

H5主动调用原生方法:

在这里插入图片描述

学到的教训:

这一年,关于模块解耦,组件开发,学到了如何灵活处理代码耦合的方式,关于模块中编写代码应严格避免硬编码的存在,不要存在侥幸偷懒的心理

技能和知识的提升:

通过探索主导【JSBridge原理解读】培训,我成功的掌握了JSBridge底层的原理逻辑,深入了解移动端与Web前端的交互原理。
通过参与【KMM跨平台项目分享】培训,成功的掌握了KMM跨平台开发模式,可统一实现移动端的逻辑开发。

感悟和总结:

回顾过去一年的点滴,我深感人生的宝贵,每一次挑战都是一次成长的机会。在新的一年里,我愿与读者共同努力,迈向新的高度,突破自我。

鼓励交流:

我鼓励大家分享你们过去一年的故事,也欢迎提出对我的征文的看法和建议,期待在评论区和大家一起交流探讨。


http://www.niftyadmin.cn/n/5314578.html

相关文章

Angular中的NgZone.run()有什么用?

在Angular中,NgZone是一个服务,用于管理异步任务的执行,并提供一种在Angular区域内或外部显式运行代码的方式。区域(Zone)的概念用于跟踪和拦截异步操作,例如Promises、事件和定时器,以便在需要…

前端工程师常用的ChatGPT通用提示词模板

HTML/CSS基础:如何熟练掌握HTML/CSS基础,包括常用标签、布局方式、样式应用等? JavaScript深入理解:如何深入理解JavaScript语言特性,包括变量类型、函数、闭包、异步编程等? 前端框架学习:如…

Spark八:Spark性能优化

Spark性能调优 Spark调优的方法,包括RDD使用、文件读取,partition 学习资料:https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark调优之RDD算子调优 1.1 RDD复用 在对RDD进行计算时,要避免相同的算子和计算逻辑下对…

R语言【base】——sample():随机取样和排列

Package base version 4.2.0 Description sample() 使用替换或不替换从参数【x】的元素中获取指定大小的样本。 Usage sample(x, size, replace FALSE, prob NULL)sample.int(n, size n, replace FALSE, prob NULL,useHash (n > 1e07 && !replace &&…

docker镜像的生成过程

镜像的生成过程 Docker镜像的构建过程,大量应用了镜像间的父子关系。即下层镜像是作为上层镜像的父镜像出现的,下层镜像是作为上层镜像的输入出现。上层镜像是在下层镜像的基础之上变化而来。 FROM centos:7 FROM指令是Dockerfile中唯一不可缺少的命令&a…

Linux服务器安全配置基线

基线要求: 安全类别 检查项 检查要求 检查步骤 备注 账户及口令安全 1.1 检查是否设置口令生存周期 应配置口令生存周期,密码最长使用期限应小于等于90天,密码最短使用期限应非0。 执行:cat /etc/login.defs,检查是否配置了以下参数。 PASS_MAX_DAYS 配置项决定密码最长使…

Linux和windows进程同步与线程同步那些事儿(二): windows线程同步详解示例

《Linux和windows进程同步与线程同步那些事儿(一)》 一、线程同步 1.1 windows下线程同步 在Windows中,线程同步可以通过多种机制来实现,其中最常见的包括互斥量(mutex)、事件(event&#xf…

深入MySQL——10

查询为何如此之慢 分为两种情况一种是查询后长时间不返回的,还有一种是查询很慢的 我们先来说第一种情况 长时间不返回 这种情况下就是锁阻塞导致不能返回,可以通过show processlist来查看语句处于什么状态,一般情况下会出现这几种状态&a…