Отключить загрузку в React родного WebView - PullRequest
0 голосов
/ 10 февраля 2020

Я использую React Native WebViw в своем приложении. Я хочу отключить загрузку файлов. В основном только документы. Я не могу отключить разрешения на хранение, так как некоторые функции в приложении нуждаются в этой функции.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

К сожалению, для этого нет простых настроек. Но по крайней мере один обходной путь довольно прост.

Реализация обработчика onShouldStartLoadWithRequest. Если вы вернете false из этого обработчика, WebView не будет загружать URL. Затем вы можете решить, хотите ли вы простую реализацию, которая просто ищет «файловые URL» или делает что-то более умное. Очень наивная реализация:

<WebView
    ref={r => this._webView = r}
    source={{ uri }}
    onShouldStartLoadWithRequest={this.checkLoadRequest}
    onNavigationStateChange={this.checkLoadRequest}
/>

...

checkLoadRequest(navigator) {
    const url = navigator.url.toLowerCase();

    // VERY naive implementation but might be all you wanted
    if (url.indexOf('.pdf') > -1 || url.indexOf('.doc') > -1) {
        // On iOS we just return false.
        // Android requires us to call stopLoading().
        this._webView.stopLoading();
        return false;
    }

    return true;
}    

Для более сложного варианта реализации вы можете использовать регулярное выражение, чтобы обнаружить больше шаблонов расширений файлов, которые вы хотите заблокировать.

Обратите внимание, что этот обработчик не может быть асинхронным c и работать должным образом кроссплатформенно. Хак, если вы хотите сделать что-то более изощренное (например, сделать HEAD-запрос к URL-адресу незаметно за кулисами, чтобы увидеть, что он собирается отправить обратно), вы можете просто заблокировать / отклонить все запросы, сделайте свои волхвы c, затем программно скажите веб-просмотру, чтобы перейти к URL, если он в порядке. В большинстве случаев навигация будет очень медленной, но очень точной.

0 голосов
/ 23 апреля 2020

Этого можно добиться, введя javascript с помощью проверки свойства controlsList = "nodownload", расположенной ниже ссылочного кода для видеофайла:

<WebView
    style={{
      height: this.props.videoPlayerHeight,
      width: this.props.videoPlayerWidth,
      backgroundColor: 'black',
    }}
    allowsFullscreenVideo={true}
    allowFileAccess={false}
    mixedContentMode="always"
    mediaPlaybackRequiresUserAction={true}
    injectedJavaScript={`document.getElementsByTagName("video")[0].controlsList="nodownload";`}
    source={{uri: `${this.props.videoLink}#t=0.01`}}
    startInLoadingState={true}
    renderLoading={this.renderLoading}
  />
...