Swift 网络访问库Alamofire 访问https localhost服务器

简介: Alamofire提供了比IOS标准库便捷的网络访问接口,沿用了Objective-C的AFNetwork的各种优点,所以成为了我迁移到Swift平台不二的选择。

Alamofire提供了比IOS标准库便捷的网络访问接口,沿用了Objective-C的AFNetwork的各种优点,所以成为了我迁移到Swift平台不二的选择。
Alamofire文档地址
不过刚刚上手就碰到了很初级的问题:使用https连接本地的服务器总是报错。

  • 为什么一定要用把人逼疯的https呢? *

2016年6月14日在WWDC 2016开发者大会上,苹果宣布了一个最后期限:2017年1月1日起,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能。

所以 现在开发一个商用的程序必须使用https来访问后台API啦

在多次碰壁无果后,只好把问题分解隔离,各个击破。

  • Alamofire的 https 连接问题。访问个baidu.com试试?
  • Alamofire 的 localhost 自定义证书的问题。
  • ATS IOS系统网络安全配置。

经验如下:

  1. Alamofire的 https 连接问题, 报错 Error Domain=NSURLErrorDomain Code=-999 “cancelled”。问题主要是由于sessionManager的生命周期导致的。通过把sessionManager 设置为类成员,避免在response回调时提前销毁,解决了正常访问baidu.com的问题。
import Foundation
import Alamofire

class NetworkManager {

    var manager: Manager?

    init() {
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        manager = Alamofire.Manager(configuration: configuration)
    }
}

2.Alamofire 的 localhost 自定义证书的问题。
需要在serverTrustPolicies中加上域名,disableEvaluation选项。注意使用域名,不需要端口等其他参数。

    class NetworkManager {

var manager: SessionManager?

init() {
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "10.68.24.127" : .disableEvaluation
    ]
    let configuration = URLSessionConfiguration.default
    manager = Alamofire.SessionManager(
        configuration: configuration,
        serverTrustPolicyManager :ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
}
    }
  1. 系统ATS安全。
    该功能属于IOS的新功能,需要配置info.plist文件。增加域名对应的配置项。
<key>NSAppTransportSecurity</key><dict>
<key>NSExceptionDomains</key>
<dict>
    <key>url.com</key>
    <dict>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
        <key>NSExceptionRequiresForwardSecrecy</key>
        <false/>
        <key>NSIncludesSubdomains</key>
        <true/>
    </dict>
</dict>

由于上面3种因素混合,导致了这个问题难以解决。
最后Alamofire的作者提供了一个很好的建议:

  • 在ServiceTrustManger的数组中设置断点来判断究竟是ATS系统阻拦了请求,还是Alamofire本身的问题。
目录
相关文章
|
8月前
|
网络协议 Linux 虚拟化
配置VM网络:如何设定静态IP以访问主机IP和互联网
以上就是设定虚拟机网络和静态IP地址的基本步骤。需要注意的是,这些步骤可能会因为虚拟机软件、操作系统以及网络环境的不同而有所差异。在进行设定时,应根据具体情况进行调整。
581 10
|
9月前
|
Shell 开发工具 git
使用代理访问网络各项命令总结
工作中常需设置代理,容易导致环境混乱。本文总结了 SourceTree 无法拉取代码的问题,排查了环境变量、Git 全局配置及系统代理设置,最终通过清除 Git 代理配置解决。内容涵盖排查步骤、命令整理及脚本处理,帮助快速定位并解决代理相关网络问题。
512 3
|
9月前
|
存储 数据挖掘 Linux
服务器数据恢复—重装系统导致OceanStor存储上的分区无法访问的数据恢复案例
服务器存储数据恢复环境: 华为OceanStor某型号存储+扩展盘柜,存储中的硬盘组建了raid5磁盘阵列,上层分配了1个lun。 linux操作系统,划分了两个分区,分区一通过lvm扩容,分区二为xfs文件系统。 服务器存储故障: 工作人员重装系统操作失误导致磁盘分区变化,分区二无法访问,数据丢失。
|
10月前
|
运维 网络协议 安全
为什么经过IPSec隧道后HTTPS会访问不通?一次隧道环境下的实战分析
本文介绍了一个典型的 HTTPS 无法访问问题的排查过程。问题表现为 HTTP 正常而 HTTPS 无法打开,最终发现是由于 MTU 设置不当导致报文被丢弃。HTTPS 因禁止分片,对 MTU 更敏感。解决方案包括调整 MSS 或中间设备干预。
|
11月前
|
数据采集 Web App开发 iOS开发
解决Python爬虫访问HTTPS资源时Cookie超时问题
解决Python爬虫访问HTTPS资源时Cookie超时问题
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
880 28
|
域名解析 监控 网络协议
21.7K star!再见吧花生壳,没有公网ip,也能搞定所有网络访问!内网穿透神器NPS
“nps”是一款强大的内网穿透工具,支持多种协议与功能。它无需公网IP或复杂配置,可实现远程桌面、文件共享和私有云搭建等。项目采用Go语言开发,具有高性能与轻量级特点,适用于远程办公、物联网管理等场景。其核心亮点包括零配置穿透、多级代理网络、实时流量监控及企业级安全特性。对比同类工具,“nps”在安装复杂度、协议支持和管理界面方面表现优异。项目地址:https://github.com/ehang-io/nps。
2881 12
|
安全 网络协议 网络安全
只有IP地址没有域名,如何实现HTTPS访问?
在仅有IP地址而无域名的情况下,实现HTTPS访问并非不可能。主要挑战包括证书颁发机构(CA)对IP地址的支持有限及浏览器兼容性问题。解决方案有:1) 搭建私有CA为内部IP地址颁发证书;2) 使用支持IP地址的公共CA服务。选择合适的方案需根据需求权衡。具体步骤包括选择证书类型、生成CSR文件、提交并完成验证、安装SSL证书和配置强制HTTPS访问。确保IP地址稳定,并定期维护安全性。 **申请优惠**:访问JoySSL官网并填写注册码“230907”可优惠申请IP地址证书。
2769 5
|
域名解析 弹性计算 应用服务中间件
使用域名访问部署在ECS上的网站
本文为您介绍如何为网站配置域名并为域名配置HTTPS证书。
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
1227 3