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

\[toc\]

demo1: 文本通信

h5 -> app

思路:

  • h5 全局属性上挂一个变量
  • app 接收这个变量的内容
  • 关键API: navigation代理 + navigationAction.request.url?.absoluteString
js 复制代码
// 这个变量挂载在 request 的 url 上 ,在浏览器实际无法运行,因此不会影响到页面本身
window.location.href="test://hellowolrd"
// app 接收这个变量
navigationAction.request.url?.absoluteString
swift 复制代码
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 = self
        webView.navigationDelegate = self
        view = webView        
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string:"http://localhost:5173/") // ok
        let 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)
    }
}

app -> h5

思路

  • app调用js语法,将app的数据通过 html dom结构或者js方法 传递给h5
  • 关键API:webView.evaluateJavaScript
html 复制代码
<!-- 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>
swift 复制代码
// app swift
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    print("webView didFinish 页面加载完成之后调用...")
    webView.evaluateJavaScript("document.getElementById('someElement1').innerText='test data1: app'") {
        (result, error) in
        if let result = result {
            print("someElement result: \(result)")
        }
        if let error = error {
            print("someElement error: \(error)")
        }
    }
    webView.evaluateJavaScript("window.getText('app')") { (result, error) in
        if let result = result {
            print("getText result: \(result)")
        }
        if let error = error {
            print("getText error: \(error)")
        }
    }
}

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

思路

  • 原生app具备调用相机和扫描二维码的能力
  • h5通过jsbridge通知app-》app执行拍照和扫描动作-》将结果返回h5
相关推荐
山海不说话几秒前
PyGame游戏开发(入门知识+组件拆分+历史存档/回放+人机策略)
开发语言·python·pygame
明月看潮生2 分钟前
青少年编程与数学 02-019 Rust 编程基础 11课题、类型系统
开发语言·青少年编程·rust·数据类型·编程与数学
大锦终17 分钟前
【C++】unordered_map与set的模拟实现
开发语言·数据结构·c++·哈希算法
WDeLiang26 分钟前
Flutter - UIKit开发相关指南 - 线程和异步
flutter·ios·dart
范纹杉想快点毕业31 分钟前
以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·windows·vscode·qt·visual studio
多多*44 分钟前
Spring之Bean的初始化 Bean的生命周期 全站式解析
java·开发语言·前端·数据库·后端·spring·servlet
少了一只鹅1 小时前
c语言内存函数
c语言·开发语言
じ☆ve 清风°1 小时前
滑动窗口算法详解与C++实现
开发语言·c++·算法
苕皮蓝牙土豆1 小时前
C++ map & multimap 容器:赋值、排序、大小与删除操作
开发语言·c++
Villiam_AY1 小时前
Go 后端中双 token 的实现模板
开发语言·后端·golang