【问题标题】:HTTPS request fails only on iOS, Ionic 2HTTPS 请求仅在 iOS、Ionic 2 上失败
【发布时间】:2017-03-05 17:09:22
【问题描述】:

我有一个Ionic 2 应用程序,它调用Spring Boot API 来向其他设备发送推送通知。 API 配置了 HTTPS。

API POST 请求适用于所有除了 iOS

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

适用于:

  • 离子服务
  • 安卓
  • 邮递员
  • 卷曲

这是请求:

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
}

Spring Boot 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 安全问题,但我不知道。

【问题讨论】:

标签: api spring-boot https ionic2


【解决方案1】:

我也有同样的问题。删除 WkWebView 即可解决问题。

ionic cordova plugin remove cordova-plugin-wkwebview-engine

更多信息:

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

移除此插件后,我可以通过 iOS 发出 http 请求

【讨论】:

  • 这对您有什么帮助?和问题中提到的问题一样吗?
  • 同样,我必须运行“ionic cordova plugin rm cordova-plugin-ionic-webview”才能让我们的应用再次使用最新的 Ionic CLI。 Sweet Christmas Ionic 的开发令人沮丧。
【解决方案2】:

我认为您的假设是正确的——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/

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

https://developer.apple.com/library/prerelease/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

【讨论】:

  • @theblindprophet 您能分享您在 iOS 应用程序控制台中收到的错误消息吗?
  • 对不起,我的意思是应用程序尝试请求时物理/模拟器 iOS 设备的控制台输出。
  • @theblindprophet 很高兴你能让事情顺利进行 :)
  • @theblindprophet 你介意接受我的回答作为你问题的答案吗?
【解决方案3】:

对于 iOS 设备,默认的 WebViewEngine 始终使用 CORS,要暂时禁用它,请将 &lt;preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" /&gt; 添加到 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

【讨论】:

    【解决方案4】:

    对我来说,解决方法是使用 @ionic-native/http 而不是 @angular/http

    离子原生 HTTP 文档:https://ionicframework.com/docs/native/http/

    这就是我找到解决方法的原因https://blog.ionicframework.com/wkwebview-for-all-a-new-webview-for-ionic/

    【讨论】:

    • 我们在哪里放置ios的证书文件?
    • 您认为为什么需要证书?如果你需要一个专门用于你的 iOS 应用程序,你必须将它单独放在 Xcode 项目中。但是如果不知道导致您出现的错误,就很难知道它是哪种证书。
    • 我已经为我们的服务器准备了一个自签名的。如果我将它放在 xcode 中,则固定证书会出错。
    • 问题是在尝试启用 ssl pinning 时,即使包含在项目中的正确位置,也找不到 pinned 证书。
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2020-03-20
    • 2017-05-24
    • 1970-01-01
    • 2018-06-18
    • 2017-06-11
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多