Fetch 和 XHR 请求在 Android 上工作,但不在 iOS 上工作

Fetch and XHR Request working on Android but not on iOS

我一直在使用 Cordova 开发一个应用程序,旨在 运行 在移动设备上,包括 iOS 和 Android。该应用程序的一部分涉及向服务器发出 POST 请求,我最初是使用 XHR 请求实现的。它成功发送数据并从服务器获得答案,但是当 运行 在 iOS 物理设备或模拟器上使用相同的应用程序时,请求 returns 0 带有空主体,跟没发一样

我转而使用 fetch-api 以尝试获取更多信息,现在我收到:

TypeError: Load failed

我无法用那个特定的措辞找到一个错误。

在 android,fetch-api 成功完成,服务器响应正确。

我的服务器有 SSL,我通过 HTTPS 发送请求。我还检查了我不太熟悉的安全策略,但我正在使用以下内容(隐藏我服务器的 url):

 <meta http-equiv="Content-Security-Policy" content="default-src 'unsafe-inline' * 'self' server.url.com data: gap: https://ssl.gstatic.com 'unsafe-inline' 'unsafe-eval' ws: wss:; style-src 'self' 'unsafe-inline'; media-src *">

我还在 Info.plist 中添加了以下内容:

       <dict>
                <key>NSExceptionDomains</key>
                <dict>
                    <key>https://server.url.com/key>
                    <dict>
                        <key>NSIncludesSubdomains</key>
                        <true/>
                        <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                        <true/>
                        <key>NSTemporaryExceptionMinimumTLSVersion</key>
                        <string>TLSv1.1</string>
                    </dict>
                </dict>
            </dict>
        <dict>

最后,我还使用白名单插件添加了域。

发送post的javascript代码如下:

let requestOptions = {
    method: 'POST',
    mode: cors,
    credentials: 'same-origin',
    cache: 'no-cache',
    redirect: 'follow',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(out_data)
};

fetch(url, requestOptions)
        .then(async response => {
            const isJson = response.headers.get('content-type').includes('application/json');
            const data = isJson && await response.json();

            if (!response.ok) {
                console.log(response.status);
                const error = (data && data.message) || response.status;
                alert("Request denied with error " + response.status.toString()) 
                return Promise.reject(error)
            }
            console.log(response.status);
            console.log(JSON.stringify(data));
        })
        .catch(error => {
            console.error("There was an error!", error);
            alert(error);
        });

您可以改用 cordova-plugin-ios-xhr 并将首选项设置为

<preference name="AllowUntrustedCerts"  value="true" />
<preference name="InterceptRemoteRequests" value="all" />

解决了很多 XHR 和 iOS

的问题