HTTPS请求仅在iOS,离子2上失败



我有一个Ionic 2应用程序,该应用程序调用Spring Boot API将推送通知发送到其他设备。API配置为HTTPS。

API POST请求在所有内容上都可以使用 iOS

我在服务器上的SSL证书是自签名的(也许就是这样吗?

工作:

  • 离子服务
  • Android
  • Postman
  • 卷曲

这是请求:

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");

收到此错误:

{
 "_body":
    {"isTrusted":true},
    "status":0,"ok":false,
    "statusText":"",
    "headers":{},
    "type":3,
    "url":null
}

春季启动API:

@CrossOrigin
@RequestMapping(value="/notifications", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<NotificationParent> sendNotifications(@RequestBody NotificationParent objs) {
    ...
    return new ResponseEntity<NotificationParent>(objs, HttpStatus.OK);
}

我假设它是iOS安全问题,但我不知道。

我也有同样的问题。删除WKWebView解决了问题。

ionic cordova plugin remove cordova-plugin-wkwebview-engine

更多信息:

https://forum.ionicframework.com/t/ios10-http-requests-blocked/67663/2?u=profitsventure

删除此插件后,我可以通过ios

提出HTTP请求

我认为您的假设是正确的 - iOS安全问题。在iOS中,默认情况下,有一种称为App Transport Security的东西,可以通过HTTP上的连接以及与自签名证书的连接。

您必须添加

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

到您项目的Info.plist,以允许您的自签名流量。

请参阅此答案以及以下链接以获取更多信息。

http://blog.ionic.io/preparing-for-ios-9/

https://gist.github.com/mlynch/284699d676fe9ed0abfa

https://developer.apple.com/library/prerelease/content/content/documentation/general/reference/infoplistkeyreference/articles/articles/cocoakeys.htmll#/apple_re_refle_refle_re_reff/doc/doc/doc/uid/uid/tp40009251-sw33

对于iOS设备,默认的WebViewEngine始终使用CORS,临时禁用它,将<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />添加到config.xml中。但是,降级到UIWebViewEngine的性能不佳。在服务器端解决它是正确的解决方案。

应将HTTP服务器配置为对CORS选项的正确响应。关键点是,访问控制范围标头不能"*",并且应包括应用程序中使用的任何自定义标头。以下是我的设置可行:

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

对我来说,修复程序是使用@ionic-native/http而不是@angular/http

离子本机http文档:https://ionicframework.com/docs/native/http/

这是引导我进入解决方案的原因https://blog.ionicframework.com/wkwebview-for-al-a-new-webview-for-ionic/

相关内容

  • 没有找到相关文章

最新更新