Webview通信系统学习指南

发布于 2025-05-06 21:22 551 字 3 min read

做产品前,先别急着写代码:我是怎么判断一个点子值不值得做的想偷卷?但微信不支持md文档?这个软件助你!新手小白如何开发练手项目?前端常见安全问题 + 防御方法 + 面试回答吉比特(雷霆游戏)前端二面问题总结吉比特27前端实习面试纷享销客前端实习一面08-刚体约束 Constraint07-监听碰撞事件和获取碰撞信息06 - 物体休眠与休眠事件详解(Cannon.js)05-碰撞与碰撞组04 - 弹性与接触材质详解03 - Cannon 材质与摩擦系数设置02 - Cannon 引擎基础碰撞讲解01 - Cannon.js 引擎的用途和基本使用一款减轻前端图片命名工作量的图片转换器总结:一个双非大学生的两年,是怎么过来的?数学公式Input-输入框组件实现详解用HTML5实现实时ASCII艺术摄像头object-fit: contain - CSS 属性详解GSAP (GreenSock Animation Platform) 动画库学习指南Webview通信系统学习指南实现手势操控3D粒子动画?太好玩了!东田数码科技前端面试前端性能优化面试回答技巧(一)React与Vue表单的对比差异融山科技前端面经·React的入门学习(一)九方前端面试JavaScript 核心:数组/字符串 API 精要指南JavaScript的常用数组API原理解析前端练习小网站-新手突破之路前端の骚操作代码合集 (二)| 让你的网页变得有趣前端Threejs入门(五)Vue 3 响应式原理:computed的模板解包机制Vue 监听器 watch 深度解析Axios 深入解析从0到1配置vue项目跟git仓库连接!前端Three.js入门(四)你懂keep-alive吗?见过Vue的小区保安吗?前端Three.js入门(三)前端Three.js入门(二)前端Three.js入门(一)-Three的第一个简单的页面 Git 大冒险:解锁代码管理的秘密武器如何将网站加载速度提升50%?前端性能优化全攻略前端の骚操作代码合集 | 让你的网页充满恶趣味进击蓝桥杯!2025web前端HTML5uniapp-页面生命周期
Webview通信系统学习指南 作者: 前端AC | 原文: https://juejin.cn/post/7501159920600301568 Webview通信系统学习指南 学习h5的知识之Webview。以下是一些理解 一、定义与核心概念 1. 什么是Webview? 定义:Web...

Webview通信系统学习指南

作者: 前端AC | 原文: https://juejin.cn/post/7501159920600301568

Webview通信系统学习指南

学习h5的知识之Webview。以下是一些理解

一、定义与核心概念

1. 什么是Webview?

  • 定义:Webview是移动端(Android/iOS)内置的轻量级浏览器组件,用于在原生应用中嵌入网页内容。
  • 作用:实现H5页面与原生应用的深度交互,弥补纯H5在性能、设备API调用上的不足。

2. 为什么需要Webview通信?

  • 能力互补:H5无法直接调用摄像头、GPS等原生能力,需通过Webview桥接。
  • 性能优化:复杂交互(如3D渲染)依赖原生性能。
  • 业务需求:内嵌H5页面需与App其他模块(如支付、登录)联动。

二、技术原理与实现

1. 核心机制

  • JS Bridge:通过自定义协议或API实现H5与原生的双向通信。
  • 数据格式:通常使用JSON传递消息,确保结构化解析。

2. 技术对比

方式适用场景优点缺点
Webview通信移动端内嵌H5直接调用原生能力开发复杂度高
Iframe通信嵌入式网页间交互兼容性好,支持跨域仅限同域或CORS配置
C++进程通信动画编辑器内部通信高效直接依赖特定工具链

三、代码实战示例

1. Android端实现

// 原生暴露接口给H5
public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

// WebView加载H5并绑定接口
WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebAppInterface(this), "AndroidBridge");
webView.loadUrl("file:///android_asset/index.html");

2. iOS端实现(Swift)

import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let contentController = WKUserContentController()
        contentController.add(self, name: "iOSBridge")
        
        let config = WKWebViewConfiguration()
        config.userContentController = contentController
        
        webView = WKWebView(frame: view.frame, configuration: config)
        view.addSubview(webView)
        
        let url = Bundle.main.url(forResource: "index", withExtension: "html")!
        webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent())
    }

    // 接收H5消息
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "iOSBridge" {
            print("收到消息:\(message.body)")
        }
    }
}

3. H5通用代码

// 调用原生方法
function callNative() {
  if (window.AndroidBridge) {
    window.AndroidBridge.showToast('Hello Android!');
  } else if (window.webkit && window.webkit.messageHandlers.iOSBridge) {
    window.webkit.messageHandlers.iOSBridge.postMessage('Hello iOS!');
  }
}

// 接收原生消息
window.addEventListener('message', function(event) {
  console.log('收到原生消息:', event.data);
});