如何让 cordova 允许从与我的网络应用程序相同的主机通过 https 下载 pdf?

How to get cordova to allow a pdf to be download over https from the same hosting as my web app?

我在 android 上有一个基本的 cordova 应用程序 运行,可以在网络视图中加载我的主要网络应用程序。

当 运行 我的 Web 应用程序通过 cordova 时,它不会通过 https 下载与我的应用程序位于同一托管订阅中的任何 pdf。

通过 https 从其他网站下载 pdf 工作正常 - 包括同一服务器上的其他托管订阅。

无论在何处托管,都可以通过 http 下载 pdf 文件。

所有其他文件(包括 txt 文件)无论托管在何处(通过 http 或 https)都可以正常下载。

示例:

https://mywebsite.com/test.txt(可以下载)

https://mywebsite.com/test.pdf(不下载)

http://mywebsite.com/test.pdf(可以下载)

https://anyanotherwebsite.com/test.txt(可以下载)

https://anyanotherwebsite.com/test.pdf(可以下载)

http://anyanotherwebsite.com/test.pdf(可以下载)

我的代码:

这是我的 cordova "index.html" 文件:

<!DOCTYPE html>
<html>
<head>
</head>
<body>

    <div class="app">

            <p>Loading</p>

    </div>

    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="js/index.js"></script>

</body>

这是我的 cordova "index.js" 文件:

var app = {

initialize: function() {
    document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},

onDeviceReady: function() {
    var targetUrl = "https://cordova1.mydevelopmentserver.com/";
    window.location.replace(targetUrl);
},

};

app.initialize();

这是我的 cordova "config.xml" 文件:

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.company_name.someid" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>My Awesome App</name>
<author email="dev@cordova.apache.org" href="http://cordova.io">Apache Cordova Team</author>
<content src="index.html" />
<preference name="SplashScreen" value="screen" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
<allow-navigation href="https://*.cordova1.mydevelopmentserver.com/*" />
<allow-navigation href="file://*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
    <allow-intent href="market:*" />
</platform>
<platform name="ios">
    <allow-intent href="itms:*" />
    <allow-intent href="itms-apps:*" />
</platform>
<preference name="ShowTitle" value="True" />
<preference name="Fullscreen" value="False" />
<plugin name="cordova-plugin-device" spec="^2.0.1" />
<engine name="android" spec="^7.0.0" />
</widget>

也尝试将 config.xml 设置更改为以下但仍然不起作用:

<access origin="*" />
<allow-navigation href="*" />
<allow-intent href="*" />

下载示例 CORDOVA 项目: https://drive.google.com/file/d/1Z3TZudstF5WqquW6M-bv-8cit3nUFNcI/view?usp=sharing

示例 cordova 项目重定向到 https://cordova1.mydevelopmentserver.com which contains the following html file which can be used to test the issue. I have also setup https://cordova2.mydevelopmentserver.com 完全相同并且该域仍然存在问题。

<!DOCTYPE html>
<html>
<head>
    <!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;"> -->
    <meta name="format-detection" content="telephone=no">
    <meta name="msapplication-tap-highlight" content="no">
    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    <title>Hello World</title>
</head>
<body>

    <p><a href="https://cordova1.mydevelopmentserver.com/test.txt">https://cordova1.mydevelopmentserver.com/test.txt</a></p>
    <p><a href="https://cordova1.mydevelopmentserver.com/test.pdf">https://cordova1.mydevelopmentserver.com/test.pdf</a></p>
    <p><a href="http://cordova1.mydevelopmentserver.com/test.pdf">http://cordova1.mydevelopmentserver.com/test.pdf</a></p>
    <hr>
    <p><a href="https://cordova2.mydevelopmentserver.com/test.txt">https://cordova2.mydevelopmentserver.com/test.txt</a></p>
    <p><a href="https://cordova2.mydevelopmentserver.com/test.pdf">https://cordova2.mydevelopmentserver.com/test.pdf</a></p>
    <p><a href="http://cordova2.mydevelopmentserver.com/test.pdf">http://cordova2.mydevelopmentserver.com/test.pdf</a></p>

</body>
</html>

其他注意事项:

我认为这不是服务器的问题,因为同一服务器上另一个网站的 pdf 链接工作正常。

我认为这不是 SSL 证书的问题,因为使用相同 SSL 的其他托管订阅链接工作正常。

我是 cordova 的新手,但我认为这可能是我配置的某个地方存在问题,但我已经尽可能多地删除了配置。

科尔多瓦版本:7.0

Android版本:7.0

Phone:三星 S8+

还在 Samsung S4 运行 Android 5.0.1 上测试过,但有同样的问题。

使用您的示例,我可以重现您的问题,它看起来与使用 WebView 有关。如果我使用 InAppBrowser,我可以通过 https 正常打开 PDF(无论它们在哪里)。

希望您至少可以使用 InAppBrowser,直到找到合适的解决方案。

如果您确定 SSL 有效性,请尝试正确设置 内容安全策略 或 cordova allow origin[= 白名单插件的 34=]https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/

如果怀疑 SSL 证书无效,请看这里:http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/

根据我的经验,我认为是某种与从 cordova webview 信任您的证书有关的问题,在上面 link 您可以尝试实施 onReceivedSslError 处理并查看如果 SSL 证书有问题。

尝试在此处测试您的 SSL 证书以确保它没有问题:https://www.ssllabs.com/ssltest/

握手模拟报告中,您可以验证许多移动平台和网络视图版本以检查证书是否可信。

希望对您有所帮助。