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
的问题
我一直在使用 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
的问题