# 11、reactNaive对接
# h5代码实现
点击查看代码
function reactNaive(name, postMessageData = {}) {
return new Promise(resolve => {
let data = {
method: name,
data: postMessageData,
id: `${name}${new Date().getTime()}${Math.ceil(Math.random() * new Date().getTime())}`
}
function eventMessage(e) {
console.log(e.data, 'RN向h5发送数据')
let res = JSON.parse(atob(e.data));
if(res.id == data.id) {
window.document.removeEventListener('message', eventMessage);
resolve(res);
}
}
window.document.addEventListener('message', eventMessage);
console.log(btoa(JSON.stringify(data)),'h5向RN发送数据')
try {
window.ReactNativeWebView.postMessage(btoa(JSON.stringify(data)));
} catch(e) {
window.postMessage(btoa(JSON.stringify(data)));
}
})
}
h5传给RN的为一个base64的字符串
{
"method":"jumpapp",
"data":{
"url":"https://www.baidu.com"
},
"id":"jumpapp1608612711261"
}
method: h5要调用RN的方法
data: method方法所需要的的参数
id: RN回调h5要回传的id
例子:
reactNaive('jumpapp', {
url: 'https://www.baidu.com'
}).then(res => {
})
res为RN的回调值
# RN端代码实现
点击查看代码
RN端依赖 react-native-webview & buffer
<WebView ref={webView}
originWhitelist={['*']}
onMessage={onMessage}
mixedContentMode="always"
source={{
uri: 'h5地址'
}}/>
// 事件监听
const onMessage = ({nativeEvent}) => {
let res = JSON.parse(new Buffer(nativeEvent.data, 'base64').toString());
switch(res.method) {
case "jumpapp":
//传给h5的数据
let data = new Buffer(JSON.stringify({
method: res.method,
data: {},
id: res.id
})).toString('base64');
webView.current.postMessage(data);
break;
}
};
nativeEvent.data: h5传给apicloud的数据为base64的字符串
res: 对象
{
"method":"jumpapp",
"data":{
"url":"https://www.baidu.com"
},
"id":"jumpapp1608612711261"
}
data: RN回传给h5的数据
{
method: 通知h5是那个方法的回调
data: 回调给h5的具体数据
id: 回调函数的唯一id
}
注意: h5和RN通信的数据为base64的字符串, 发送和接受时需要加密和解密