Почему инъекции скриптов WebView не работают? - PullRequest
0 голосов
/ 04 мая 2020

этот документ предполагает, что я должен иметь возможность вводить значения в веб-страницу, отображаемую компонентом WebView, так что значение может использоваться при загрузке страницы:

https://github.com/react-native-community/react-native-webview/blob/master/docs/Guide.md#communicating -between- В частности, js -and-native

, приведенный ниже код показывает, как установить значение в объекте window, но не показывает, как он используется:

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

export default class App extends Component {
  render() {
    const runFirst = `
      window.isNativeApp = true;
      true; // note: this is required, or you'll sometimes get silent failures
    `;
    return (
      <View style={{ flex: 1 }}>
        <WebView
          source={{uri: 'my-url-here'}}
          injectedJavaScriptBeforeContentLoaded={runFirst}
        />
      </View>
    );
  }
}

страница, которую я загружаю, выглядит так:

<html>
  <body>
    <script>
    alert(window.isNativeApp)
    </script>
  </body>
</html>

, которая отображает undefined. Я также попробовал:

<html>
  <body>
    <script>
    var fn = function() {
      alert(window.isNativeApp)
    }
    document.addEventListener('DOMContentLoaded', fn, false)
    </script>
  </body>
</html>

с идентичными результатами. учитывая, что я должен иметь возможность отправлять значения веб-страницы, как я должен их использовать?

из моего package.json:

"react-dom": "~16.9.0",
"react-native": "^0.62.1",
"react-native-webview": "^8.2.1",

Приложение I

на самом деле вышеприведенное, похоже, не работает вообще. если я попробую следующее:

    const runFirst = `
      console.log('INJECTION')
      alert('INJECTION')
      true; // note: this is required, or you'll sometimes get silent failures
    `;

я не получу ни оповещения, ни следа в журнале. конечно, я не уверен, может ли alert() работать до загрузки документа или журнал будет виден мне в выводе консоли обычного приложения

, напротив, injectedJavaScript, кажется, работает , хотя после документа загружается, что означает, что во время выполнения <script> в моем do c значение еще не было установлено

1 Ответ

0 голосов
/ 05 мая 2020

для следующего бедняги, который борется с этим, библиотека сломана и будет (когда-нибудь) исправлена, но в то же время это работает:

<WebView
  source={{uri: 'my-url-here'}}
  injectedJavaScriptBeforeContentLoaded={runFirst}
  onMessage={event => { alert(event.nativeEvent.data )}}
/>

onMessage предназначен для связи в другом направлении, но его простое присутствие заставляет код работать

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