Получение сообщения от внедренного JavaScript в React Native WebView - PullRequest
0 голосов
/ 19 октября 2018

В своем приложении React Native я использую WebView для отображения рекламы Google (AdSense) с помощью свойства "injectedJavascript".Проблема в том, что я не могу знать высоту объявления заранее.Поэтому я сначала задаю ему случайную высоту, и когда его стиль обновляется, я планирую правильно установить его высоту.

Я предполагаю, что должен получить высоту во введенном коде JS, а затем использую окно.postMessage () "метод для отправки его в WebView через опору" onMessage ".

MutationObserver в сочетании с обещаниями кажется очень подходящим для этого случая.На данный момент я хотел бы просто получить сообщение от веб-просмотра.Так что это мой код прямо сейчас, но сообщение не отправляется:

export default class App extends Component {
constructor(props) {
    super(props);
}

_onMessage(e) {
    console.warn(e.nativeEvent.data);
}

render() {
    const jsCode = ` 
        window._googCsa('ads', pageOptions, adblock1);

        function waitForAdSense(id) {
            var config = {
                attributes: true,
                attributeFilter: ['style'],
            };

            return new Promise((resolve, reject) => {
            var adSenseElement = document.body.getElementById(id);
            if (adSenseElement.style) {
                resolve(adSenseElement.style.height);
                return;
            }
            var observer = new MutationObserver(function(mutations) {
                mutations.forEach(function(mutation) {
                if (mutation.attributeName === 'style') {
                    observer.disconnect();
                    resolve(adSenseElement);
                    return;
                }
            });
        });
        observer.observe(adSenseElement, config);
    });
    }

    waitForAdSense('afscontainer1').then(height => {
    window.postMessage(height, '*');
    });
    `;
    return (
    <ScrollView>
        <WebView
        key={'AdSense'}
        ref={'webview2'}
        style={{ height: 300 }}
        source={{
            uri: isAndroid
            ? 'file:///android_asset/widget/adSense.html'
            : './widget/index.html',
        }}
        javaScriptEnabled={true}
        mixedContentMode="compatibility"
        injectedJavaScript={jsCode}
        scrollEnabled={false}
        domStorageEnabled={true}
        onMessage={this._onMessage}
        scalesPageToFit
        startInLoadingState={true}
        automaticallyAdjustContentInsets={false}
        />
        ;
    </ScrollView>
    );
}
}

Хотя я могу заставить его работать с этим кодом, но setTimeout - не лучшее решение:

  window._googCsa('ads', pageOptions, adblock1);

  var adSenseContainer = document.getElementById("afscontainer1");

  setTimeout(function(){ window.postMessage(adSenseContainer.style.height, '*'); },1000); 

Doу тебя есть идеи?Я думаю, что моя функция waitForAdSense () может быть как-то прослушена.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Мне удалось заставить его работать с этими изменениями в введенном коде:

window._googCsa('ads', pageOptions, adblock1);

  function waitForAdSense() {
      var config = {
          attributes: true,
          attributeFilter: ["style"]
      };

      var adSenseContainer = document.getElementById("afscontainer1");

      return new Promise((resolve, reject) => {
          var observer = new MutationObserver(function (mutations) {
              mutations.forEach(function (mutation) {
                  if (mutation.attributeName === 'style' && adSenseContainer.style.height) {
                      var height = adSenseContainer.style.height;
                      resolve(height);
                      observer.disconnect();
                      return;
                  };
              });
          });
          observer.observe(adSenseContainer, config);
      });
  };

    waitForAdSense().then(height => {
        window.postMessage(height, '*');
    });

Спасибо за советы!

0 голосов
/ 19 октября 2018

Лучшим решением было бы использовать AdMob вместо AdSense в мобильном приложении React Native.Несколько бессмысленно возиться с этими проблемами, поскольку JavaScript AdSense не был создан с учетом этого варианта использования.Вот библиотека , созданная для простой интеграции AdMob в ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...