Android API 30 上的 Nativescript WebView 产生 ERR_ACCESS_DENIED

Posted

技术标签:

【中文标题】Android API 30 上的 Nativescript WebView 产生 ERR_ACCESS_DENIED【英文标题】:Nativescript WebView on Android API 30 yields ERR_ACCESS_DENIED 【发布时间】:2021-12-05 22:39:37 【问题描述】:

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

net::ERR_ACCESS_DENIED(-1)

我发现 this post 建议我修改一些 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 事件没有任何效果。

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

【问题讨论】:

【参考方案1】:

我将代码移至页面的加载事件处理程序,现在一切正常,我根本不使用 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);
  

【讨论】:

以上是关于Android API 30 上的 Nativescript WebView 产生 ERR_ACCESS_DENIED的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android API 30 设备中使用静态广播接收器或类似服务?

Android 平台上的 Google+ API 和 Google+ 登录弃用和停用

"natives"啥意思

使用 React Natives 的 usestate 函数后,包含方法失败

Cordova [Android 平台] 从 API 29 迁移到 API 30

类 org.apache.hadoop.fs.s3native.NativeS3FileSystem 未找到(Spark 1.6 Windows)