【问题标题】:Running cordova app webview with http instead of https使用 http 而不是 https 运行 cordova app webview
【发布时间】:2023-02-24 05:40:13
【问题描述】:

如何在 http://localhost 而不是 https://localhost 上运行 cordova app 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.

【问题讨论】:

  • 将您的呼叫更新为 https?这里的问题是什么?
  • 并非所有 CORS 请求都指向支持 https 的域,这就是问题所在
  • 好吧,我不想成为那个人,但世界已经转向 https...Let's Encrypt 是免费的...
  • <preference name="Scheme" value="https" />

标签: cordova https mixed-content


【解决方案1】:

可能的解决方案:

  1. 将您所有的网页内容更改为http。这样,就没有混合内容。您可以通过在全局 config.xml(在项目根目录中)的 widget 标记内添加 &lt;content src="http://localhost/index.html" /&gt; 来完成此操作。放置它的好地方是在&lt;autor&gt; 标签之后和&lt;access origin 标签之前。

  2. 构建您自己的插件(仅限 Android)。如果您使用的是 cordova,那么您希望使用 HTML、JavaScript 和 CSS 进行编码。我知道。但是构建简单插件的 Java 代码并没有那么难写。您的插件唯一需要做的就是运行这段代码:

    如果(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 界面可以做的事情,但它在使用移动设备中存在的东西(如相机、传感器等)时具有优势。访问那些只使用标准 Web api 的东西,当一个 cordova插件没有帮助,效率较低并且需要更多努力。在某些情况下,这根本不可能。

    NAS 只能由连接到同一 LAN 的机器访问。不需要https。安全性处于 LAN 隔离状态。如果 LAN 受到威胁……但这是经过计算的风险。

    例如,我第一次尝试获取 http://192.168.1.61/login.php 时出现“混合内容”错误。因为科尔多瓦索引.html页面加载使用https我们试图从http.

    解决方案: 使应用程序的 index.html 页面使用 http 加载,因此没有混合内容。这是通过在全局 config.xml(在项目根目录中)的 widget 标签内添加 &lt;content src="http://localhost/index.html" /&gt; 来实现的。

    此应用程序不在商店中,将来也不会有。它通过手动 APK 安装加载到设备。更新/安装时,您必须在每台设备中临时启用“允许来自其他来源的应用程序”。

    同样,不要假设如果商店中没有某样东西,或者不是为大量观众开发的,那么它就不存在或根本不重要。那里有很多合法的用例。

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2011-05-03
    • 2021-07-14
    相关资源
    最近更新 更多