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+ 登录弃用和停用
使用 React Natives 的 usestate 函数后,包含方法失败
Cordova [Android 平台] 从 API 29 迁移到 API 30
类 org.apache.hadoop.fs.s3native.NativeS3FileSystem 未找到(Spark 1.6 Windows)