iOS https网络请求

在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。当然,因为这样的推进影响面非常广,作为缓冲,我们可以在 Info.plist 中添加 NSAppTransportSecurity 字典并且将 NSAllowsArbitraryLoads 设置为 YES 来禁用 ATS。

不过,WWDC 16 中,Apple 表示将继续在 iOS 10 和 macOS 10.12 里收紧对普通 HTTP 的访问限制。从 2017 年 1 月 1 日起,所有的新提交 app 默认是不允许使用 NSAllowsArbitraryLoads来绕过 ATS 限制的,也就是说,我们最好保证 app 的所有网络请求都是 HTTPS 加密的,否则可能会在应用审核时遇到麻烦。


所以尝试删除NSAllowsArbitraryLoads看APP是否可以使用,其中我们的服务器已经升级为https请求,我使用的是xcode8。


1.内网环境没什么问题

据说xcode8不针对ip地址组成的网址实行ATS规则,但是Xcode7对ip地址组成的网址也会实行ATS规则。


2.AFNetworking

只要将AFHTTPSessionManager的securityPolicy属性如下设置就可以进行https请求

        securityPolicy.allowInvalidCertificates = YES;
        securityPolicy.validatesDomainName = NO;

allowInvalidCertificates设置为YES标示为,允许自签名证书(不是苹果内置认同的证书),默认为NO。validatesDomainName这是为NO标示不核对域名,默认为YES。

如果设置

securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone ];
那么https请求会取消。不过如果在APP里加入了证书,并且证书的格式为.509格式(用苹果自带钥匙串工具直接另存就可以)的证书可以如下设置

securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate ];


3.UIWebView和WKWebView

很遗憾一直报错,错误如下

Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, NSUnderlyingError=0x17024fe40 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802}}, NSErrorPeerCertificateChainKey=(
    ""
), _kCFStreamErrorCodeKey=-9802, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., _WKRecoveryAttempterErrorKey=, NSErrorFailingURLStringKey=https://www.yljr.com/zqyl-web/views/app/ios_help.html, NSErrorFailingURLKey=https://www.yljr.com/zqyl-web/views/app/ios_help.html

查了很多资料,全部都是通过设置允许http请求,来避免错误。不知道AFNetwork是如何绕过ATS 限制,目前除了设置允许http请求之外,只能通过邮件将证书安装到手机的描述文件里。这样https请求才可以顺利进行。














你可能感兴趣的:(网络通信)