Skip to main content

React Native 和 WebView 互相收发消息

React Native WebView 是RN的HTML渲染组件,它接受 HTML 或 URI 来加载文档,简单来说就是像浏览器那样的组件,用 WebView 实现 H5 + Native 混合开发,可以让 H5 代码更加通用。WebView 主要用 message 的方法与文档通信。

安装 WebView

本文安装的 WebView 版本是 11.x.x

yarn add react-native-webview

React Native WebView 快速安装文档

安装后,重新编译项目。

H5 -> Native

组件会给 H5 的 window 对象注入 ReactNativeWebView,postMessage 方法用来向 Native 发送消息,参数只能是 string 类型

H5

window.ReactNativeWebView.postMessage("Message from H5");

Native

const H5ToNative = () => {
  <WebView
    onMessage={e => {
      // e.nativeEvent.data 取得 "Message from H5"
      console.log(e.nativeEvent.data)
    }}
  />
}

onMessage 回调中 e 的内容示例

{
    "nativeEvent": {
        "canGoBack": false,
        "canGoForward": false,
        "data": "Message from H5",
        "loading": false,
        "target": 9,
        "title": "TEST",
        "url": "about:blank"
    }
}

Native -> H5

反过来,Native 也可以向 H5 发送消息,参数也只能是 string 类型。

Native

const NativeToH5 = () => {
  const webviewRef = React.useRef<WebView>()
  const do = () => { // 主动向 H5 发送数据
    webviewRef.current?.postMessage("Message from Native")
  }
  <WebView ref={webviewRef} />
}

H5

document.addEventListener("message", e => {
  // e.data 可取得 "Message from Native"
  console.log(e.data)
})

注意 H5 收到 e 后,直接 console.log(e) 不会打印出数据,但是 e.data 可取得数据。