SuperAPI AI 工具集

axiom-networking-migration

编程与开发

查看项目

更新于 10-16 10:32

技能介绍

用途

本技能是一份 Apple 平台网络框架迁移指南,用于指导开发者将现有网络代码从旧 API 迁移到新 API,并帮助判断哪些场景应当迁移、哪些场景应当保持原状。

主要能力

迁移决策树

技能提供了一套判断流程,依据当前使用的网络 API 给出建议:

  • 使用 URLSession 处理 HTTP/HTTPS REST API:应继续使用 URLSession。资料说明它是 HTTP 的正确工具,负责缓存、Cookie、认证挑战、HTTP/2/3,并针对 Web API 做了大量优化;Network.framework 面向自定义协议,而非 HTTP。
  • 使用 BSD Sockets(socket、connect、send、recv):应迁移到 NWConnection(iOS 12+)。
  • 使用 NWConnection / NWListener:若需要 async/await,应迁移到 NetworkConnection(iOS 26+);若基于回调的代码运行正常,则保持原样(未被弃用)。
  • 使用 URLSession StreamTask 处理 TCP/TLS:若需要 UDP 或自定义协议,应迁移到 NetworkConnection;若仅需 TCP/TLS 用于 HTTP,应继续使用 URLSession。
  • 使用 SCNetworkReachability:已被弃用,应替换为 NWPathMonitor(iOS 12+)。资料给出示例代码,通过 pathUpdateHandler 打印在线或离线状态。
  • 使用 CFSocket / NSStream:已被弃用,应替换为 NWConnection(iOS 12+)。

迁移一:从 BSD Sockets 到 NWConnection

技能提供迁移映射表,包括:

  • socket() + connect() → NWConnection(host:port:using:) + start(),默认非阻塞
  • send() / sendto() → connection.send(content:completion:),异步立即返回
  • recv() / recvfrom() → connection.receive(minimumIncompleteLength:maximumLength:completion:),异步立即返回
  • bind() + listen() → NWListener(using:on:),自动端口绑定
  • accept() → listener.newConnectionHandler,每个连接的回调
  • getaddrinfo() → 由 NWConnection 处理 DNS,带竞速的智能解析
  • SCNetworkReachability → connection.stateUpdateHandler 等待状态,无竞态条件
  • setsockopt() → NWParameters 配置,类型安全选项

技能同时给出迁移前后代码示例。迁移前代码使用阻塞式 connect、手动 DNS 解析和 unsafe 指针发送数据;迁移后使用 NWConnection、stateUpdateHandler、send(content:completion:) 和 start(queue:)。资料列出的收益包括:代码从 20 行缩短为 10 行,无需手动 DNS、无阻塞、无 unsafe 指针,并自动获得 Happy Eyeballs、代理支持和 WiFi Assist。

迁移二:从 NWConnection 到 NetworkConnection(iOS 26+)

资料给出迁移理由:async/await 消除回调地狱;内置 TLV 分帧和 Coder 协议;不再需要 [weak self](async/await 处理取消);通过异步序列进行状态监控。

迁移映射表包括:

  • connection.stateUpdateHandler = { state in } → for await state in connection.states { },异步序列
  • connection.send(content:completion:) → try await connection.send(content),挂起函数
  • connection.receive(minimumIncompleteLength:maximumLength:completion:) → try await connection.receive(exactly:),挂起函数
  • 手动 JSON 编解码 → Coder(MyType.self, using: .json),内置 Codable 支持
  • 自定义分帧 → TLV { TLS() },内置 Type-Length-Value
  • 到处使用 [weak self] → 不再需要 [weak self],Task 取消自动化

迁移前后示例展示了从完成回调、手动内存管理,改为 async/await 和自动内存管理。资料列出的收益包括:代码从 30 行缩短为 15 行,无回调嵌套、无 [weak self],错误通过 throws 自然传播,Task 退出时自动取消。

迁移三:从 URLSession StreamTask 到 NetworkConnection

资料说明何时迁移:需要 UDP(StreamTask 仅支持 TCP);需要超出 TCP/TLS 的自定义协议;需要底层控制(包节拍、ECN、服务等级)。

何时保持使用 URLSession:进行 HTTP/HTTPS(URLSession 已为此优化);需要 WebSocket 支持;需要内置缓存与 Cookie 处理。

示例展示将 URLSession.streamTask 的 write 与 readData 回调,改为 NetworkConnection 配合 TLS 的 async/await 发送与接收。

使用方式

开发者根据自身网络 API 使用情况,对照技能中的决策树确定迁移路径,再参考对应迁移章节的映射表和前后代码示例,逐步替换旧 API。技能本身以文档和代码示例形式提供,不涉及安装命令。

适用场景

  • 维护使用 BSD Sockets、CFSocket、NSStream 或 SCNetworkReachability 的旧代码,并计划现代化。
  • 已有 NWConnection 代码,希望采用 async/await 并迁移到 iOS 26+ 的 NetworkConnection。
  • 使用 URLSession StreamTask 处理 TCP/TLS,正在评估是否迁移。
  • 需要判断某类网络需求是否应继续使用 URLSession 而非 Network.framework。

限制

  • 迁移到 NetworkConnection 需要 iOS 26+。
  • Network.framework 面向自定义协议,不适用于 HTTP;HTTP/HTTPS 场景资料建议继续使用 URLSession。
  • 具体 API 的可用性与平台版本要求以资料所述为准,其他平台或更早版本信息暂未提供。
  • 资料未提及收费、价格或商业条款。