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

Posted

技术标签:

【中文标题】Cordova [Android 平台] 从 API 29 迁移到 API 30【英文标题】:Cordova [Android platform] migration from API 29 to API 30 【发布时间】:2021-11-27 13:33:17 【问题描述】:

我正在尝试迁移我的移动应用程序(使用 Cordova 和 AngularJS 为 androidios 平台开发),我遇到了从 API 29 到 API 30 的一些问题。在我的应用程序中,我从 REST 服务下载了一个带有分隔的 JSON 目录我存储在数据目录 (cordova.file.dataDirectory) 中的图片(JPG 格式)。 使用 API 设置为 29 的应用程序构建,应用程序运行良好,下载图片并在 html 页面中显示它们(使用 AngularJS 更新)。但是,如果我尝试将 API 设置为 30 来构建它,应用程序会继续工作(它会正确下载数据目录中的 json 和 jpg 文件),但不会显示存储在该目录中的图片。 我还尝试使用所有更新的组件(Cordova 10.0.0、Android 平台 10.0.0、插件等)创建一个新的简单移动应用程序,但我得到了相同的行为,我无法解决这个问题。你能帮我或你知道如何解决它吗?

使用 API 29 构建信息应用程序

科尔多瓦 v8.1.2 安卓平台v8.0.0

使用 API 30 构建信息应用程序

科尔多瓦 v10.0.0 安卓平台 v10.0.0

插件列表

cordova-plugin-android-permissions 1.0.2 “权限” 科尔多瓦插件相机 4.1.0 “相机” 科尔多瓦插件兼容 1.2.0 “兼容” cordova-plugin-datepicker 0.9.3 “日期选择器” 科尔多瓦插件设备 2.0.3 “设备” cordova-plugin-dialogs 2.0.2 “通知” 科尔多瓦插件文件 6.0.2 “文件” 科尔多瓦插件文件哈希 0.4.1 “文件哈希” 科尔多瓦插件文件路径 1.5.8 “科尔多瓦插件文件路径” cordova-plugin-geolocation 4.0.2 “地理位置” cordova-plugin-globalization 1.11.0 “全球化” cordova-plugin-inappbrowser 3.2.0 “InAppBrowser” cordova-plugin-network-information 2.0.2 “网络信息” cordova-plugin-sign-in-with-apple 0.1.2 “cordova-plugin-sign-in-with-apple” cordova-plugin-splashscreen 5.0.3 “启动画面” 科尔多瓦插件状态栏 2.4.3 “状态栏” cordova-plugin-whitelist 1.3.4 “白名单” cordova-plugin-wkwebview-engine 1.2.1 “Cordova WKWebView 引擎” cordova-plugin-wkwebview-file-xhr 2.1.4 “Cordova WKWebView 文件 XHR 插件” cordova-sqlite-storage 5.0.0 "Cordova s​​qlite 存储插件 - cordova-sqlite-storage 插件版本" ionic-plugin-keyboard 2.2.1 “键盘” phonegap-plugin-mobile-accessibility 1.0.5-dev "移动辅助功能"

【问题讨论】:

【参考方案1】:

尝试添加到您的配置中

 <preference name="AndroidInsecureFileModeEnabled" value="true" />

【讨论】:

谢谢埃里克!将 Cordova v10.0.0 与 Android Platform v10.0.0 一起使用(添加您建议的参数)我创建了一个简单的应用程序,它能够显示来自 dataDirectory 的图像。现在我需要将我所有的代码和插件迁移到新的更新容器,但这似乎是正确的方法。谢谢!【参考方案2】:

Eric 建议的设置可能对您有用,但不推荐。新的 cordova-android 版本使用名为 WebViewAssetLoader 的 API 来在适当的 http(s) 方案而不是 file: 上加载您的应用程序。我怀疑您在下载数据时遇到了 CORS 问题。

详细了解 Cordova 中的 WebViewAssetLoader:https://cordova.apache.org/announcements/2021/07/20/cordova-android-10.0.0.html

更好的方法是找出合适的 CORS 并且不使用 insecure 设置。您应该找到大量有关 CORS 的资源。如果您需要帮助,请回复。

【讨论】:

你能不能给我解释一下,我没明白。用于下载文件的 REST 服务具有正确的 CORS 设置,因此应用程序能够下载 JSON 目录和 JPG 文件并将其存储在 cordova.file.dataDirectory 中。当我尝试在 HTML 页面中显示图片时(使用 cordova.file.dataDirectory 将路径转换为 ​​file:///data/user/0/........./files/picture_file_name.jpg)图像未显示,并且视图中出现损坏的图像。当您说“将您的应用程序加载到适当的 http(s) 方案而不是文件上”时,您能解释一下您的意思吗?谢谢! 默认情况下,您的应用程序现在以 URL https://localhost/index.html 而不是 file://android_asset/www/index 或其他内容开始。这就是我所说的“正当起源”。当您为图像使用本地文件时,您可能需要此“不安全”设置。我不确定文件插件或 Cordova 是否提供了一种通过localhost/something 在此目录中加载文件的方法。有关 WebViewAssetLoade 的详细信息,请参阅此公告:cordova.apache.org/announcements/2021/07/20/…

以上是关于Cordova [Android 平台] 从 API 29 迁移到 API 30的主要内容,如果未能解决你的问题,请参考以下文章

Cordova Android 6.4.0 创建 res 文件夹顶层不在平台 android 内

无法在 Cordova 中删除 Android 平台

Cordova 添加平台 android 错误

更改Cordova项目的android包名称

如何将android添加到cordova平台?路径错误?

从 Cordova 项目构建的英特尔 XDK