详解 Network.framework:iOS 网络开发的新基石
引言
自 iOS 12 和 macOS 10.14 起,Apple 推出了一个新的网络开发框架 —— Network.framework。它被定位为下一代网络连接的基础设施,让开发者可以以更安全、更高效的方式,管理 TCP、UDP、TLS 乃至未来的新型协议连接。
如果你还停留在 NSURLSession
、CFStream
、BSD socket
的编程方式,那么了解 Network.framework,将帮助你构建出更加现代、安全、灵活的 iOS 应用。
本文将从基础到实战,全面带你认识 Network.framework。
1. 什么是 Network.framework?
Network.framework 是 Apple 提供的一套面向连接级别(Connection Level)编程的现代化 API。
它专注于:
- 创建和管理 TCP / UDP 连接
- 加密连接(TLS)
- 多路径传输(Multipath TCP)
- 网络状态实时监控(如 Wi-Fi/蜂窝网络切换)
- 更安全的连接(默认支持 TLS 验证)
📦 支持的主要特性包括:
特性 | 说明 |
---|---|
TCP/UDP 连接 | 可直接管理传输层连接 |
TLS 支持 | 内建安全连接机制 |
多路径支持 | 自动在 Wi-Fi 和蜂窝之间切换 |
网络路径感知 | 实时监测网络变化,优化连接策略 |
连接状态管理 | 支持状态机(Ready/Waiting/Failed) |
低功耗优化 | 移动设备上的更智能资源管理 |
2. 为什么推出 Network.framework?
Apple 推出 Network.framework,主要为了解决旧网络编程接口存在的问题:
旧方式 | 存在问题 |
---|---|
BSD Socket (C API) | 过于底层,容易出错,手动管理 fd |
CFStream / CFSocket | API 繁杂,扩展性差,TLS 处理复杂 |
NSURLSession | 高层 HTTP 请求很好,但无法细粒度控制底层连接 |
Network.framework 通过现代设计理念:
- 提供异步、基于状态机的连接模型
- 自动管理网络变化(如断网重连)
- 安全性默认开启(TLS by default)
- 减少低级错误,提升开发效率
3. Network.framework 的核心组件
3.1 NWConnection
表示单个连接。可以是:
- TCP 连接
- UDP 连接
- TCP+TLS 安全连接
你可以用它来手动建立、管理、发送、接收数据。
let connection = NWConnection(host: "example.com", port: 443, using: .tls)
3.2 NWListener
表示服务端监听器。用于:
- 监听某个端口
- 接受进来的 TCP/UDP 连接
- 自建服务器应用(如 P2P、局域网服务)
let listener = try NWListener(using: .tcp, on: 1234)
3.3 NWPathMonitor
用于实时监控网络状态变化,比如:
- 检测当前是 Wi-Fi 还是蜂窝数据
- 网络是否切换、断开、恢复
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("Network available")
} else {
print("No connection")
}
}
monitor.start(queue: .global())
3.4 NWParameters
连接的配置参数,包括:
- 传输协议选择(TCP、UDP)
- 安全策略(启用/禁用 TLS)
- 传输选项(如启用 Keep-Alive、多路径 TCP)
let parameters = NWParameters(tls: .init(), tcp: .init())
4. Network.framework 与 URLSession 的关系
- URLSession 是应用层,面向 HTTP/HTTPS。
- Network.framework 是传输层,直接控制 TCP/UDP/TLS。
它们的位置关系大致如下:
App
└── URLSession(HTTP/HTTPS 层)
└── CFNetwork
└── Network.framework(TCP/TLS/UDP)
👉 简单说,Network.framework 并不是用来发 HTTP 请求的。如果你需要自己实现 HTTP、WebSocket、自定义协议,才用它。
5. 实战示例:使用 NWConnection 发起 HTTPS 请求
import Network
let host = NWEndpoint.Host("example.com")
let port = NWEndpoint.Port.https
let parameters = NWParameters(tls: NWProtocolTLS.Options())
let connection = NWConnection(host: host, port: port, using: parameters)
connection.stateUpdateHandler = { newState in
switch newState {
case .ready:
print("Connection ready!")
let httpRequest = """
GET / HTTP/1.1\r
Host: example.com\r
Connection: close\r
User-Agent: NWConnectionClient\r
\r
"""
connection.send(content: httpRequest.data(using: .utf8), completion: .contentProcessed({ _ in
print("Request sent")
}))
receiveResponse(connection: connection)
case .failed(let error):
print("Connection failed: \(error)")
default:
break
}
}
func receiveResponse(connection: NWConnection) {
connection.receive(minimumIncompleteLength: 1, maximumLength: 4096) { data, _, isComplete, error in
if let data = data, !data.isEmpty {
let response = String(data: data, encoding: .utf8) ?? "<binary>"
print("Received response: \(response)")
}
if isComplete {
connection.cancel()
} else if error == nil {
receiveResponse(connection: connection)
}
}
}
connection.start(queue: .global())
这段代码完成了:
- 建立 TCP + TLS 连接
- 手动发送 HTTP 报文
- 接收服务器返回的数据
(注意:并没有用 URLSession
!而是自己控制了连接细节。)
6. 适合使用 Network.framework 的场景
场景 | 说明 |
---|---|
自定义协议 | 比如自定义的 IoT 协议、游戏协议 |
WebSocket 通信 | 自己实现基于 TCP/TLS 的 WebSocket |
低延迟通信 | 需要实时性强的连接,比如在线游戏、直播 |
需要多路径支持 | 比如无感切换 Wi-Fi ↔ 蜂窝数据 |
构建 VPN / 代理工具 | 需要底层管理连接 |
7. Network.framework 的优势总结
✅ 更安全(默认启用 TLS)
✅ 更高效(异步、低功耗优化)
✅ 支持多路径(Multipath TCP)
✅ 易用的 Swift 风格 API
✅ 适配未来(如 QUIC、HTTP/3)
✅ 系统级优化(网络切换无感知)
小结
Network.framework 是苹果面向未来网络通信推出的重要基建。它为 iOS/macOS 开发者打开了更多灵活、安全、低延迟的通信能力大门。
虽然它不会取代 URLSession
(发 HTTP 还是要用 URLSession),但如果你的应用涉及底层连接、定制协议、实时通信 ——
那么掌握 Network.framework,就是成为高级 iOS 网络开发者的重要一环。
下一步建议学习:
- 深入理解
NWConnection
状态机(.setup / .waiting / .ready / .failed / .cancelled) - 如何使用
NWParameters
配置连接参数 - 如何实现 Multipath TCP 支持
- 如何结合 DoH 查询结果,基于 IP 建立连接(绕过系统 DNS)