0

我有一个 NativeScript 6.8 JavaScript 应用程序,它使用 WebView 来显示在引用本地图像文件的应用程序中组成的 html 字符串。Google Play 商店迫使我支持 API 30,当我这样做时,WebView 失败并显示

net::ERR_ACCESS_DENIED(-1)

我发现这篇文章建议我修改一些 Android WebView 的访问设置,这样我的代码现在看起来像这样

AndroidManifest.xml:

<application 
  ...
  android:usesCleartextTraffic="true">

xml:

<GridLayout>  
  <WebView id="annbyday" loadFinished="onLoadFinished" src="{{ htmlsrcForDay }}" />
</GridLayout>

js:

exports.onLoadFinished = function (args) {

  if (args.object.android) {
    if (!args.error) {
      let webView = args.object.android;
      webView.getSettings().setAllowFileAccess(true);
      webView.getSettings().setAllowContentAccess(true);
      console.log("announce-page.onLoadFinished:  settings set");
    } else {
      console.warn("announce-page.onLoadFinished:  " + args.error);
    }
  }
}

当我运行它时,我在控制台中收到这些消息:

JS: announce-page.onLoadFinished:  settings set
JS: announce-page.onLoadFinished:  net::ERR_ACCESS_DENIED(-1)
JS: announce-page.onLoadFinished:  net::ERR_ACCESS_DENIED(-1)
JS: announce-page.onLoadFinished:  settings set

在第一次导航到页面时,会显示 android 错误屏幕。但是,如果我重新导航到该页面,我只会收到“设置集”消息,并且 html 会正确显示。好像设置有效,但设置得不够快。将代码移动到 LoadStarted 事件没有任何效果。

我觉得我很接近;我欢迎任何帮助。

4

1 回答 1

0

我将代码移动到页面的加载事件处理程序,现在一切都按预期工作,我根本不使用 WebView 的 loadStarted 或 LoadFinished 事件。最后的代码是,

exports.onLoaded = function (args) {
  const page = args.object;
  const webView = page.getViewById("<WebView id>");
  if (webView.android) {
    let setter = webView.android.getSettings();
    setter.setAllowFileAccess(true);
    setter.setAllowContentAccess(true);
  }
于 2021-10-25T16:23:52.973 回答