【发布时间】:2017-04-30 19:45:35
【问题描述】:
我无法让 React Native WebView postMessage 工作。 React Native 应用程序成功接收到来自 Web 应用程序的 post 消息。但是 Web 应用没有收到 React Native 应用发送的消息。
我的简单网络应用
<html>
<body>
<button>Send post message from web</button>
<div>Post message log</div>
<textarea style="height: 50%; width: 100%;" readonly></textarea>
<script>
var log = document.querySelector("textarea");
document.querySelector("button").onclick = function() {
console.log("Send post message");
logMessage("Sending post message from web..");
window.postMessage("Post message from web", "*");
}
window.addEventListener("message", function(event) {
console.log("Received post message", event);
logMessage(event.data);
}, false);
function logMessage(message) {
log.append((new Date()) + " " + message + "\n");
}
</script>
</body>
</html>
此网络应用托管在:https://popping-heat-6062.firebaseapp.com/
我的简单 React Native 应用
import React, {Component} from "react";
import {AppRegistry, Text, View, TouchableHighlight, WebView} from "react-native";
export default class WevViewApp extends Component {
constructor( props ) {
super( props );
this.webView = null;
}
onMessage( event ) {
console.log( "On Message", event.nativeEvent.data );
}
sendPostMessage() {
console.log( "Sending post message" );
this.webView.postMessage( "Post message from react native" );
}
render() {
return (
<View style={{flex: 1}}>
<TouchableHighlight style={{padding: 10, backgroundColor: 'blue', marginTop: 20}} onPress={() => this.sendPostMessage()}>
<Text style={{color: 'white'}}>Send post message from react native</Text>
</TouchableHighlight>
<WebView
style={{flex: 1}}
source={{uri: 'https://popping-heat-6062.firebaseapp.com'}}
ref={( webView ) => this.webView = webView}
onMessage={this.onMessage}
/>
</View>
);
}
}
AppRegistry.registerComponent( 'WevViewApp', () => WevViewApp );
预期结果
- 单击“从网络发送帖子”按钮发送 向 React Native 应用程序发布消息并在调试器中登录 窗口
- 单击“从 React Native 发送帖子”按钮 向 Web 应用程序发送帖子消息并在 Web 中打印出来 文本区域
实际结果
- Web 应用成功向 React Native 应用发送消息并登录到调试器窗口
- React Native 应用程序不成功向网络应用程序发送消息,并且未在网络文本区域中打印出来
有人知道为什么网络应用没有收到消息吗?
通过 Android 和 iOS 测试。
相关文档:https://facebook.github.io/react-native/docs/webview.html
编辑:经历了可能查明问题的行为。
当直接在网络浏览器中测试“从网络发送帖子”按钮时,textarea 会记录它已经发送了消息并且收到了它自己的消息。
Thu Dec 15 2016 10:20:34 GMT+0100 (CET) Sending post message from web..
Thu Dec 15 2016 10:20:34 GMT+0100 (CET) Post message from web
在 React Native 应用程序的 WebView 中尝试相同操作时,textarea 只会打印出来
Thu Dec 15 2016 10:20:34 GMT+0100 (CET) Sending post message from web..
WebView 是否劫持了 window.postMessage 方法并注入了自定义方法?
documentation中提到了这个:
设置此属性会将 postMessage 全局注入到您的 webview,但仍会调用 postMessage 的预先存在的值。
也许这是错误的,这就是问题所在?
【问题讨论】:
-
我也有同样的问题,花了一整天的时间寻找解决方法,但是没有,正在处理一个拉取请求,也许我们会得到一些解决方案。 github.com/facebook/react-native/pull/10941
标签: javascript html webview react-native