WWDC Quick Look 💓 By SwiftGGTeam
What's new in URLSession

What's new in URLSession

观看原视频

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

评论

GitHub Issues · utterances