Highlight
URLSession 在 2025 引入请求与解码合并的新 API、原生 Privacy Pass 集成、内置重试策略以及连接级性能指标。
核心内容
写过 iOS 网络层的人都熟悉这套样板:发起请求、检查 HTTP 状态码、把 Data 喂给 JSONDecoder、做错误映射,最后才轮到业务逻辑。一个项目里几十个调用点,每点重复同一段流程,错一处就漏一类异常。这是 URLSession 长期以来的痛——async/await 解决了回调地狱,但解码与错误处理仍然是手工活。
URLSession 在 2025 把这条链路下沉到了框架内部。开发者声明返回类型,URLSession 负责拉数据、检查状态、解码并抛错,业务代码直接拿到模型对象。配套的还有 Private Access Tokens 原生协商、指数退避重试策略,以及覆盖到 TLS 握手与 DNS 解析的连接级 metrics。这些更新的共同方向,是把过去散落在每个 APIClient 里的私有实现交给系统统一处理。
详细内容
请求-解码合并的典型用法如下,类型由调用方提供,URLSession 负责中间所有步骤:
struct UserProfile: Codable {
let id: String
let name: String
}
let url = URL(string: "https://api.example.com/me")!
let profile: UserProfile = try await URLSession.shared.data(
from: url,
as: UserProfile.self
)
关键点:
data(from:as:)接受目标类型作为参数,调用方在签名上就声明期望什么。- 返回值是已解码的
UserProfile,省掉了(Data, URLResponse)元组与JSONDecoder().decode(...)调用。 - HTTP 错误状态码在框架内部抛出,调用点只需要一个
try await就覆盖网络层、解码层两类异常。
重试策略改在配置层声明,所有从该 configuration 创建的 task 共享一致行为:
let config = URLSessionConfiguration.default
config.retryPolicy = .exponentialBackoff(
maxRetries: 3,
initialInterval: .seconds(1)
)
let session = URLSession(configuration: config)
关键点:
retryPolicy写在URLSessionConfiguration上,整个 session 内的请求统一行为。.exponentialBackoff是系统提供的策略类型,开发者不再自己实现等待与计数逻辑。- 把重试收口在配置层,意味着切换策略只改一处,不需要走遍每个调用点。
Privacy Pass 的接入对客户端透明,开发者只需要在服务端实现验证端点;URLSession 会在符合条件的请求上自动协商令牌,服务端拿到的是”真设备真 app”的证明,但不携带任何用户标识。
核心启发
- 统一项目里的重试逻辑:为什么值得做——多数项目里重试散落在各个 APIClient,写法不一致,难以排障。怎么开始:建一个返回
URLSessionConfiguration的工厂方法,所有 session 从这里出,先把策略对齐,再考虑具体参数。 - 新接口先在新模块用:为什么值得做——
data(from:as:)的收益是省样板代码,但全量迁移老项目风险大于收益。怎么开始:约定新写的网络调用一律使用新 API,老代码跟随业务重构顺手迁移,不开专门的迁移 PR。 - 为防刷接口排期 Privacy Pass:为什么值得做——登录、注册、支付这类接口长期被脚本和黑产骚扰,过去靠自建风控,现在系统层提供了零用户信息的设备证明。怎么开始:先与服务端协调验证端点的实现成本,客户端无需改动,但要把上线时间压在服务端就绪之后。
- 把 metrics 接进监控看板:为什么值得做——
URLSessionTaskMetrics现在能拿到 TLS 握手与 DNS 解析耗时,是排查移动网络长尾的关键数据。怎么开始:在内部 debug build 先采样,确认数据形态,再决定是否上传到现有 APM 系统。
关联 Session
- Use structured concurrency with Network framework — 结构化并发与底层 Network 框架的搭配,URLSession 之外的另一条路径。
- Filter and tunnel network traffic with NetworkExtension — 系统级网络流量过滤与隧道,URLSession 之上的扩展点。
- Embracing Swift concurrency — async/await 的核心模型,理解 URLSession 新 API 的前提。
- Supercharge device connectivity with Wi-Fi Aware — 设备间点对点网络连接的新方案。
- Get ahead with quantum-secure cryptography — 抗量子加密,与隐私令牌一起构成新的安全栈。
评论
GitHub Issues · utterances