Je ne parviens pas à faire fonctionner React Native WebView postMessage. L'application React Native reçoit correctement le message de message envoyé par l'application Web. Mais l'application Web ne ne pas recevoir de messages envoyés depuis l'application React Native.
Mon application web simple
<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>
Cette application web est hébergée à: https://popping-heat-6062.firebaseapp.com/
Mon simple React Application 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 );
Résultat attendu
Résultat réel
Quelqu'un sait-il pourquoi l'application Web ne reçoit pas les messages?
Testé avec les deux Android et iOS.
Documentation connexe: https://facebook.github.io/react-native/docs/webview.html
Modifier : a rencontré un comportement qui peut identifier le problème.
Lorsque vous testez le bouton "Envoyer un message depuis le Web" directement dans un navigateur Web, la zone de texte enregistre qu'il a envoyé le message et qu'il a également reçu son propre message.
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
lors de la même tentative dans WebView à partir de l'application React Native, la zone de texte ne s'imprime que
Thu Dec 15 2016 10:20:34 GMT+0100 (CET) Sending post message from web..
Est-ce que WebView détourne la méthode window.postMessage et en injecte une personnalisée?
Ceci est mentionné dans la documentation :
La définition de cette propriété injectera un global postMessage dans votre vue Web, mais appellera toujours des valeurs préexistantes de postMessage.
C'est peut-être faux et c'est là que se situe le problème?
J'ai eu le même problème et l'ai résolu en ajoutant l'écouteur d'événements au document au lieu de la fenêtre. Changement:
window.addEventListener("message", ...
à:
document.addEventListener("message", ...
Version 5 de react-native-webview modifie le fonctionnement de ce comportement . Vous voulez maintenant:
window.ReactNativeWebView.postMessage(data);