android 在React native WebView中禁用下载

bxpogfeg  于 2023-06-20  发布在  Android
关注(0)|答案(4)|浏览(231)

我在我的应用程序中使用React Native WebViw。我想禁用文件下载。主要是文件。我无法禁用存储权限,因为应用程序中的某些功能需要此功能。

a11xaf1n

a11xaf1n1#

不幸的是,没有简单的设置。但至少有一个解决方法是相当简单的。
实现一个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;
}

对于更复杂的实现选项,您可以使用正则表达式来检测您想要阻止的更多文件扩展名模式。
请注意,此处理程序不能是异步的,也不能跨平台正常工作。如果你想做一些更复杂的事情(例如),那就是黑客。在后台向URL发出HEAD请求,看它会发送什么),你可以阻止/拒绝所有请求,施展你的魔法,然后编程地告诉webview导航到URL,如果它是OK的。在大多数情况下,它会使导航非常缓慢,但非常准确。

m1m5dgzv

m1m5dgzv2#

你可以通过注入一个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}
  />
9nvpjoqh

9nvpjoqh3#

<WebView
                      scrollEnabled={false}
                      javaScriptEnabled={true}
                      allowsFullscreenVideo={true}
                      userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 
 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
                      source={{uri: htmlAttribs.src}}
                      mediaPlaybackRequiresUserAction={true}
                      injectedJavaScript={`document.getElementsByTagName("video")[0].controlsList="nodownload";`}
                      style={{flex: 1, width: '100%', aspectRatio: 16.0 / 9.0}}
                    />
20jt8wwn

20jt8wwn4#

<WebView
        source={{ uri: url }}
        onShouldStartLoadWithRequest={(res)=>{
          if (res.navigationType !== 'other') {
            return false
          } else {
            return true
          }
        }}/>

相关问题