如何在 http://localhost 而不是 https://localhost 上运行 cordova 应用程序 webview ?
我一直在使用 API 级别 (targetSdkVersion) 30 编译我的应用程序,据我所知,我的应用程序是通过 http 在内部运行的,因为对 http url 的所有 CORS 请求都工作正常。 现在,根据 Playstore 的要求,我正在使用 targetSdkVersion 31,并且我看到我的应用程序正在通过 https 运行,因此 webview 阻止了对 http 的 CORS 请求。
Mixed Content: The page at 'https://localhost/index.html' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://www...com/ajax/get_domain.json.php'. This request has been blocked; the content must be served over HTTPS.
可能的解决方案:
将所有网页内容更改为
http
。这样就不会出现混合内容。您可以通过在全局 <content src="http://localhost/index.html" />
(在项目根目录中)的 widget
标记内添加 config.xml
来完成此操作。放置它的好位置是在 <autor>
标签之后和 <access origin
标签之前。
构建您自己的插件(仅限 Android)。如果您使用 cordova,那么您希望使用 HTML、JavaScript 和 CSS 进行编码。我知道。但是构建一个简单插件的 Java 代码并不那么难以编写。你的插件唯一要做的就是运行这段代码:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { WebSettings 设置 = ((WebView)this.webView()).getSettings(); settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
您将花费更多时间来学习需要实现的界面插件,即复制和粘贴该代码块。
现在...在有人说“正确的做法是使用 HTTPS”之前。
看,如果我们正在寻找解决方案,那是因为我们处于一种你无法预测的情况,这显然与你的经历相矛盾。但这并不会降低其合法性。
我自己的用例
并非所有重要的事情都发生在 Play 商店中。
我们有一个带有自定义 Web 界面的 NAS 服务器,随着我们对功能的新需求,我们正在对其进行编码和发展。
例如,如果您想使用 samba 共享在不连接的情况下上传,我们在
http://192.168.1.61/upload
有一个 http 文件上传页面。而且,在有人说“为什么......”之前,因为您可能从不受信任的机器上传,并且您不想将您的凭据输入到可能记录它们的机器中。上传页面不需要凭据,并将文件放在临时目录中,人们会在决定其最终目的地之前查看它们。
我们还有一个 Cordova 应用程序,可以录制音频并在后台将其上传到 NAS,然后将其转换为文本并将其保存到数据库。
为什么是一个应用程序而不是 NAS 界面中的简单另一个页面?因为将录音作为应用程序实现会更好。因此,该应用程序可以执行 Web 界面所做的许多事情,但在使用移动设备中存在的功能(例如相机、传感器等)时,它具有优势。当 Cordova 访问仅使用标准 Web api 的内容时插件没有帮助,效率较低并且需要更多努力。在某些情况下,根本不可能。
NAS 只能由连接到同一 LAN 的计算机访问。不需要https。安全性在 LAN 隔离中。如果 LAN 受到损害...但这是经过计算的风险。
例如,我第一次尝试获取
http://192.168.1.61/login.php
时,我收到了“混合内容”错误。因为 Cordova index.html 页面是使用 https 加载的,并且我们尝试从 http 获取。
解决方案:使应用程序的index.html页面使用http加载,因此没有混合内容。这是通过在全局
<content src="http://localhost/index.html" />
(在项目根目录中)的小部件标签内添加 config.xml
来实现的。
此应用程序不在商店中,将来也不会出现。它通过手动 APK 安装加载到设备。更新/安装时,您必须在每个设备中暂时启用“允许来自替代来源的应用程序”。
再次强调,不要认为如果某样东西不在商店中,或者不是为大量受众开发的,那么它就不存在或根本不重要。有很多合法的用例。
您能解释一下在哪里以及如何使用这个插件吗?我是科尔多瓦新手,想了解这一点。
谢谢