当前位置: 首页 > news >正文

jsbridge实战2:Swift和h5的jsbridge通信

[[toc]]

demo1: 文本通信

h5 -> app

思路:

  • h5 全局属性上挂一个变量
  • app 接收这个变量的内容
  • 关键API: navigation代理 + navigationAction.request.url?.absoluteString
// 这个变量挂载在 request 的 url 上 ,在浏览器实际无法运行,因此不会影响到页面本身
window.location.href="test://hellowolrd"
// app 接收这个变量
navigationAction.request.url?.absoluteString
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {var webView: WKWebView!override func loadView() {let webConfiguration = WKWebViewConfiguration()webView = WKWebView(frame: .zero, configuration: webConfiguration)// 【1】设置自己为webview的代理webView.uiDelegate = selfwebView.navigationDelegate = selfview = webView        }override func viewDidLoad() {super.viewDidLoad()let myURL = URL(string:"http://localhost:5173/") // oklet myRequest = URLRequest(url: myURL!)webView.load(myRequest)print("viewDidLoad...")}
}
extension ViewController: WKNavigationDelegate {//【2】通过 navigationAction.request.url?.absoluteString  获取 h5 传递的数据func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {print("webView decidePolicyFor ...")print(navigationAction.request.url?.absoluteString)decisionHandler(.allow)}
}

Snipaste_2023-10-04_20-51-41

app -> h5

思路

  • app调用js语法,将app的数据通过 html dom结构或者js方法 传递给h5
  • 关键API:webView.evaluateJavaScript
<!-- h5页面 -->
<div id="someElement1">test data1</div>
<div id="someElement2"></div>
<script>window.getText=function(data){const reuslt = 'test data2:'+data;document.getElementById('someElement2').innerText = reuslt;return reuslt; }
</script>
// app swift
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {print("webView didFinish 页面加载完成之后调用...")webView.evaluateJavaScript("document.getElementById('someElement1').innerText='test data1: app'") {(result, error) inif let result = result {print("someElement result: \(result)")}if let error = error {print("someElement error: \(error)")}}webView.evaluateJavaScript("window.getText('app')") { (result, error) inif let result = result {print("getText result: \(result)")}if let error = error {print("getText error: \(error)")}}
}

Snipaste_2023-10-04_21-29-22

demo2: h5通过app调用相机和扫描二维码

思路

  • 原生app具备调用相机和扫描二维码的能力
  • h5通过jsbridge通知app-》app执行拍照和扫描动作-》将结果返回h5

Snipaste_2023-10-04_21-41-50

http://www.lryc.cn/news/182283.html

相关文章:

  • 集合原理简记
  • 机器学习的超参数 、训练集、归纳偏好
  • Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)
  • 如何像人类一样写HTML之图像标签,超链接标签与多媒体标签
  • 1300*C. Rumor(并查集贪心)
  • python实用小代码(数据分析向)
  • 【oncmdmsg 鼠标】2023/8/19 上午9:50:14
  • 插入排序:简单而有效的排序方法
  • OpenGL之光照贴图
  • 隐私交易成新刚需,Unijoin 凭什么优势杀出重围?
  • 小谈设计模式(12)—迪米特法则
  • Foxit PDF
  • 《Python趣味工具》——ppt的操作(刷题版)
  • 实战型开发--3/3,clean code
  • 家用无线路由器如何用网线桥接解决有些房间无线信号覆盖不好的问题(低成本)
  • 【Golang】网络编程
  • 使用策略模式优化多重if/else
  • 逆强化学习
  • postgresql新特性之Merge
  • 【注解】注解解析与应用场景
  • mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?
  • Linux驱动设备号分配与自动创建设备节点
  • 基于MFC和OpenCV实现人脸识别
  • 力扣 -- 377. 组合总和 Ⅳ
  • 阿里云新账户什么意思?老用户、产品首购详细说明
  • C++ YAML使用
  • 十二、Django之模板的继承+用户列表
  • wzsc_文件上传(条件竞争)
  • unplugin-vue-components和unplugin-auto-import插件
  • docker系列文章目录