android - 如何解决 postMessage from WebView to React Native does not work for Android

标签 android react-native

这个基本的 postMessage 示例适用于 IOS,但不适用于 Android

Android 上的 React Native 应用程序无法接收从注入(inject) WebView 的 js 代码(const simple)发送的 post 消息。

import React, {Component} from 'react';
import {
    WebView
} from 'react-native';

export default class App extends Component<{}> {
    render() {
        const simple = function() { window.postMessage('my message from Webview to RN');}
        const postMessageCode = '(' + String(simple) + ')();';
        return (
            <WebView
                source={{uri: 'https://github.com/facebook/react-native'}}
                injectedJavaScript={postMessageCode}
                onMessage={this.onWebViewMessage}
            />
        );
    }

    onWebViewMessage(event) {
        alert(event);
    }
}

这已通过以下测试:

  • react-native-cli: 2.0.1
  • native react :0.50.4

开启: - Android 模拟器版本 26.0.0-3833124,Android 7.1.1,API 25 - 安卓原生设备ONE E1005(一加X),安卓版本6.0.1,API 23

谁能够让 postMessage 在 Android 设备/模拟器上正常工作(WebView --> RN)或者认为他们知道怎么做?

最佳答案

我遇到了同样的问题。 Android 浏览器在 React Native 上将监听器附加到 postMessage 似乎有延迟。参见 https://github.com/facebook/react-native/issues/11594

我在我的网页上使用这个小 helper 来绕过它:

var message = 'some message string';

window.parent.postMessage(message,"*"); 

function whenRNPostMessageReady(cb) {
    if (postMessage.length === 1) cb();
    else setTimeout(function() { whenRNPostMessageReady(cb) }, 100);
}
whenRNPostMessageReady(function() {
    //react native accepts strings only
    window.parent.postMessage(JSON.stringify(message),"*");
});

关于android - 如何解决 postMessage from WebView to React Native does not work for Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517965/

相关文章:

android - 如何在xamarin forms android中更改导航栏文本颜色

android - 在模拟器上运行的 ContentResolver 找不到 mp3 文件

javascript - React Native 从 android res 导入音频文件

react-native - vs 代码 react-native lint 冲突

java - 为什么 BluetoothLEScanner 不调用它的 ScanCallback

android - 如何为主要设备创建 Android 布局?

android - 是否可以在Android中以编程方式收听扬声器的输出?

javascript - 为什么当远程调试未激活时我的用户为空,而当其激活时它是一个对象?

javascript - true 和 falsey 值作为 useState 的初始值未正确反射(reflect)

java - react native - 错误 : method does not override or implement a method from a supertype