Реагировать на родной WebView onMessage не вызывается Android - PullRequest
1 голос
/ 02 апреля 2019

У меня есть веб-просмотр, внутри этого веб-просмотра мне нужно ввести код js для получения информации, а затем получить эту информацию через onMessage.

Проблема в том, что onMessage никогда не активируется, он не получает никакой информации.

У меня проблема между postMessage и onMessage, похоже, они не общаются.

Я пытаюсь на Android.

Ссылка: Expo

Код:

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

export default class ResolveUrl extends Component {
  constructor() {
    super();
    this.state = {
      urlOpenload: '',
      code: '',
      isMounted: false,
    };
  }

  componentDidMount() {
    this.setState({ isMounted: true });
  }
  componentWillUnmount() {
    this.setState({ isMounted: false });
  }

  Openload(url) {
    return new Promise(async (resolve, reject) => {
      setTimeout(() => {
        if (this.state.isMounted) {
          this.setState({ urlOpenload: url });
          setInterval(() => {
            if (this.state.code != '')
              resolve('https://openload.co/stream' + this.state.code);
          }, 5000);
        }
      }, 1000);
    });
  }

  get(type, url) {
    type = type.toLowerCase();
    return new Promise(async (resolve, reject) => {
      switch (type) {
        case 'openload':
          resolve(this.Openload(url));
          break;
      }
    });
  }

  render() {
    const jsCodeOpenload = `
        (function ready() {
          function whenRNPostMessageReady(cb) {
            if (window.postMessage.length === 1) cb();
            else setTimeout(function() { whenRNPostMessageReady(cb) }, 100);
          }
          whenRNPostMessageReady(function() {
            window.postMessage(document.getElementById('lqEH1').innerHTML);
          });
        })();`;
    return (
      <View>
        {this.state.urlOpenload != '' && (
          <WebView
            source={{
              uri: this.state.urlOpenload,
            }}
            onMessage={evt => {
              alert(evt.nativeEvent.data)
              this.setState({ code: evt.nativeEvent.data });
            }}
            injectedJavaScript={jsCodeOpenload}
            javaScriptEnabled
            style={{ flex: 1 }}
          />
        )}
      </View>
    );
  }
}
...