Hybrid开发中如何在React页面里调用原生UI组件?
我最近在做Hybrid App,用React写H5页面,但有个需求是要调用原生的弹窗(比如iOS的UIAlertController),而不是用JS的alert。我查了下资料说可以通过JSBridge来通信,但试了几次都没成功,原生那边收不到消息。
我在React里是这样写的:
const showNativeAlert = () => {
if (window.ReactNativeWebView) {
window.ReactNativeWebView.postMessage(JSON.stringify({
type: 'showAlert',
title: '提示',
message: '这是原生弹窗'
}));
}
};
但点击按钮后完全没反应,控制台也没报错。是不是我漏了什么配置?或者原生那边需要额外注册监听?
window.ReactNativeWebView这个对象是React Native WebView组件专用的,如果你不是在RN环境里跑,这个对象根本就不存在,当然没反应。先搞清楚你的场景。如果是原生iOS/Android项目里套了个WebView,那你得自己实现JSBridge,不能直接用RN的那套。
说下原生端怎么搞。
iOS端用WKWebView的话,需要注入一个messageHandler。原生代码里这样写:
前端调用方式改成这样:
Android端用WebView的JavascriptInterface:
还有个常见坑,Android这边记得开启JS支持:
你可以在前端先打个log,看看
window.webkit或者window.AndroidBridge到底存不存在。如果都不存在,说明原生端没配置好注入,找你们iOS和Android同事确认下。这种跨端通信的问题,前端和原生两边都得配合,单方面调试很难搞。