升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错

本文讨论了iOS9引入的AppTransportSecurity(ATS)特性及其对使用HTTP协议的应用的影响,提供了两种解决方案:服务器升级至TLS1.2或在Info.plist中设置允许任意加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因  iOS9引入了新特性App Transport Security (ATS)

新特性要求App内访问的网络必须使用HTTPS协议。
但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。现在也不能马上改成HTTPS协议传输。

 

解决方案

方案一:让服务器修改为TLS1.2

 

方案二:在plist中设置使用http请求

  1. 在Info.plist中添加NSAppTransportSecurity类型Dictionary

  2. NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

第一步:在plist中添加NSAppTransportSecurity项,此项为NSDictionary

第二步:在NSAppTransportSecurity下添加


NSAllowsArbitraryLoads类型为Boolean,value为YES

<think>我们正在处理用户的问题:"iOS网络请求报错解决方案"。用户希望了解在iOS开发中遇到网络请求报错时的解决方案。根据提供的引用内容,我们可以总结出几种常见的报错场景及其解决方案。首先,我们回顾引用内容:-引用[1]:针对HTTPS请求ErrorCode=-999(cancelled)的解决方案,建议通过设置`securityPolicy`允许不进行SSL证书验证来处理SSL证书过期等问题。-引用[2]:H5页面在iOS上调用微信分享报错的解决方案,提到在Vue路由中处理iOS微信H5页面跳转问题。-引用[3]:iOS处理POST请求报错问题,指出自定义头部导致非简单请求触发预检请求(OPTIONS),需要服务器设置允许携带的头部(如token)才能通过预检。-引用[4]:axios拦截器使用POST请求报错,解决方案包括转换参数格式(使用`$.param`)或使用`URLSearchParams`传递参数。-引用[5]:iOSHTTP请求报错,提示需要安全连接(ATS),即要求使用HTTPS。现在,我们结合这些引用,整理iOS网络请求报错的常见类型及解决方案:###1.SSL证书验证失败(ErrorCode=-999)当SSL证书过期或不受信任时,请求会被取消。可以通过以下方式临时绕过(但建议仅在开发环境使用,生产环境应使用有效证书):```swift//使用AFNetworkingAFHTTPSessionManager*manager=[AFHTTPSessionManagermanager];manager.securityPolicy=[AFSecurityPolicypolicyWithPinningMode:AFSSLPinningModeNone];manager.securityPolicy.allowInvalidCertificates=YES;//允许无效证书manager.securityPolicy.validatesDomainName=NO;//不验证域名```###2.ATS(AppTransportSecurity)限制iOS默认要求使用HTTPS。如果需要使用HTTP,需在Info.plist中配置:```xml<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>```###3.非简单请求(预检请求失败)当请求包含自定义头部或非简单方法(如PUT、DELETE)时,浏览器会先发送OPTIONS请求进行预检。解决方案:-服务器需正确响应OPTIONS请求,设置允许的HTTP方法、头部等。-例如,在响应头中添加:```Access-Control-Allow-Origin:*Access-Control-Allow-Methods:GET,POST,OPTIONSAccess-Control-Allow-Headers:Content-Type,Authorization,Token```###4.POST请求参数格式问题如果使用类似axios的库,参数格式不正确可能导致服务器接收不到数据。解决方案:-使用`URLSearchParams`:```javascriptconstparams=newURLSearchParams();params.append(&#39;key1&#39;,&#39;value1&#39;);params.append(&#39;key2&#39;,&#39;value2&#39;);axios.post(url,params);```-或者使用`$.param`(需引入jQuery)将对象转换为查询字符串。###5.其他常见错误-**网络权限问题**:iOS10+需要在Info.plist中配置`NSAppTransportSecurity`,同时对于非HTTPS请求可能需要额外设置。-**后台模式**:长时间后台网络请求需要开启后台模式权限(但苹果审核严格,需合理使用)。-**URL格式错误**:确保URL字符串正确(无非法字符,正确编码)。###总结步骤1.**检查错误代码**:根据NSError的code和domain定位问题。2.**验证网络连接**:确保设备网络正常。3.**检查URL和请求参数**:确保请求格式正确。4.**服务器配置**:检查CORS(跨域资源共享)配置、HTTPS证书有效性。5.**调试工具**:使用Charles等工具抓包分析请求和响应。§§相关问题§§1.如何解决iOSHTTPS请求的证书信任问题?2.iOS中如何配置以允许HTTP请求?3.如何处理跨域请求(CORS)导致的iOS网络请求失败?4.如何调试iOS网络请求?5.在iOS中,如何处理POST请求参数格式问题?</think>### iOS 网络请求报错解决方案总结 根据常见报错场景,结合引用内容,提供以下系统化解决方案: #### 1. **SSL证书验证失败(Error Code=-999)** **问题原因**:iOS严格校验HTTPS证书有效性,证书过期/不受信任时请求被取消[^1]。 **解决方案**: ```swift // 使用AFNetworking时 let manager = AFHTTPSessionManager() let securityPolicy = AFSecurityPolicy(pinningMode: .none) securityPolicy.allowInvalidCertificates = true // 允许无效证书 securityPolicy.validatesDomainName = false // 不验证域名 manager.securityPolicy = securityPolicy ``` > **注意**:生产环境应修复证书问题,此方案仅限调试[^1]。 #### 2. **ATS安全策略拦截(非HTTPS请求)** **问题特征**:报错提示 *"App Transport Security requires secure connection"*[^5]。 **解决方案**: 在 `Info.plist` 中添加: ```xml <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> ``` > **适用场景**:测试HTTP接口或内部网络环境[^5]。 #### 3. **POST请求被拦截(自定义Header问题)** **问题原因**:iOS安全机制拦截非简单请求(含自定义Header的POST请求)[^3]。 **解决方案**: - **前端处理**:确保预检请求(OPTIONS)通过 ```javascript // axios示例:转换参数格式 const params = new URLSearchParams(); params.append(&#39;token&#39;, &#39;your_token&#39;); axios.post(url, params); ``` - **后端配合**:响应头需包含: ``` Access-Control-Allow-Origin: * Access-Control-Allow-Headers: * ``` #### 4. **微信H5页面路由兼容性问题** **问题现象**:iOS微信内H5页面跳转失败[^2]。 **解决方案**: ```javascript // Vue路由守卫示例 router.beforeEach((to, from, next) => { const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent); if (isIOS && to.path !== location.pathname) { location.assign(to.fullPath); // iOS微信特殊处理 } else { next(); } }); ``` #### 5. **通用调试建议** 1. **抓包分析**:使用Charles/Wireshark检查请求/响应数据 2. **错误码解析**: - `-1001`:请求超时 → 检查网络/服务器响应 - `-1009`:无网络连接 → 检测设备网络状态 - `-1017`:数据解析失败 → 验证响应格式 3. **网络权限检查**: - iOS 13+需在`Info.plist`添加`NSAllowsLocalNetworking` > **关键原则**:生产环境必须使用有效HTTPS证书,调试方案仅限开发阶段[^1][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值