我有一个Ionic 2
应用程序调用{{1}} API将推送通知发送到其他设备。 API使用HTTPS配置。
API Spring Boot
请求适用于除 POST
之外的所有内容。
我在服务器上的SSL证书是自签名的(可能就是这样吗?)。
适用于:
以下是请求:
iOS
标题回复如下:
public sendNotificationRequest(title: string, action: string, name: string, tokens: any, notifications: boolean) {
// Check if user turned off notifications
if(!notifications) {
return;
}
let headers = new Headers({'Content-Type': 'application/json'});
headers.append('Authorization', 'Basic ' + btoa(this.username_decrypted + ':' + this.password_decrypted));
let body = this.formObj(tokens, title, action, name);
console.log(body);
this.http.post("https://<some-url>",
body, { headers: headers }
).subscribe((response) => {
console.log("HTTPS RESPONSE");
console.log(response);
}, function(error) {
console.log("HTTPS ERROR");
console.log(error);
});
}
收到此错误:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
Spring Boot API:
{
"_body":
{"isTrusted":true},
"status":0,"ok":false,
"statusText":"",
"headers":{},
"type":3,
"url":null
}
我假设它存在iOS安全问题,但我不知道。
答案 0 :(得分:4)
我也有同样的问题。删除WkWebView解决了这个问题。
ionic cordova plugin remove cordova-plugin-wkwebview-engine
更多信息:
https://forum.ionicframework.com/t/ios10-http-requests-blocked/67663/2?u=profitsventure
删除此插件后,我可以通过iOS发出http请求
答案 1 :(得分:3)
我认为你的假设是正确的 - 一个iOS安全问题。在iOS中,有一种称为App Transport Security的东西,默认情况下不允许通过HTTP连接和使用自签名证书的连接。
你必须添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
到项目的Info.plist
以允许自签名流量。
有关详细信息,请参阅this answer以及以下链接。
http://blog.ionic.io/preparing-for-ios-9/
答案 2 :(得分:0)
对我而言,修复方法是使用@ionic-native/http
代替@angular/http
。
离子原生HTTP文档:https://ionicframework.com/docs/native/http/
以下是导致我采用该解决方法https://blog.ionicframework.com/wkwebview-for-all-a-new-webview-for-ionic/
的原因答案 3 :(得分:0)
对于iOS设备,默认的WebViewEngine始终使用CORS,要暂时禁用它,请将<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />
添加到config.xml
。但是,降级为UIWebViewEngine
的效果不佳。在服务器端解决它是正确的解决方案。
应该将HTTP服务器配置为对CORS OPTIONS预检请求具有正确的响应。关键是Access-Control-Allow-Headers不能为“ *”,并且应包括应用程序中使用的任何自定义标题。以下是我有效的设置:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, MyCustomHeader