Highlight
iOS 15 通过”自动切换 5G”和”智能数据模式”在系统层自动管理网络接口选择,开发者应停止根据网络类型做判断,改用
allowsExpensiveNetworkAccess和allowsConstrainedNetworkAccess让应用自适应不同网络环境。
核心内容
从 2G 到 5G,每一代移动网络都带来了新的应用可能性。2G 让短信和彩信成为可能,3G 把互联网装进口袋,4G 让高清视频通话和实时多人游戏成为日常。5G 的理论速度可达 4Gbps,延迟低至 7 毫秒,还支持更多设备同时连接。
但 5G 也带来了新的挑战。5G 网络比 LTE 更耗电,覆盖不均匀,而且用户可能使用的是按流量计费的套餐。开发者如果简单地把 5G 当成”更快的 Wi-Fi”来用,可能会让用户面临电量快速下降或流量超额的风险。
Apple 在 iOS 15 中内置了两项系统级技术来解决这个问题:
自动切换 5G(Automatic Switch to 5G):系统持续评估 Wi-Fi、LTE 和 5G 的相对性能,自动为当前任务选择最佳网络接口。下载大文件时切到 5G,后台低数据任务用 LTE,公共 Wi-Fi 不安全时优先蜂窝网络。
智能数据模式(Smart Data Mode):检测网络拥塞并自动迁移到阻力最小的接口。在体育场、会议中心等拥挤场所,系统会把连接从拥塞的 Wi-Fi 迁移到 5G,保证应用的网络服务不中断。
这意味着开发者不需要、也不应该再写代码判断”当前是 Wi-Fi 还是 5G”。系统已经做了这个决策,开发者只需要关注网络是否”昂贵”或”受限”。
详细内容
停止根据网络类型做判断
(09:18)过去常见的做法:
// 不要这样做
if currentNetworkType == .wifi {
// 下载高清视频
} else if currentNetworkType == .cellular {
// 只下载缩略图
}
这种做法在 5G 时代会阻碍应用获得最佳体验。5G 的速度可能是公共 Wi-Fi 的 10 倍,而且系统支持多路径网络。如果用户同时连接了 Wi-Fi 和 5G,系统可能选择 5G 作为数据传输通道。
正确的做法是通过 URLSession 或 Network 框架的属性来判断网络特性:
let config = URLSessionConfiguration.default
config.allowsExpensiveNetworkAccess = true
config.allowsConstrainedNetworkAccess = false
let session = URLSession(configuration: config)
关键点:
allowsExpensiveNetworkAccess:控制是否允许在昂贵网络(如按流量计费的蜂窝)上执行请求allowsConstrainedNetworkAccess:控制是否允许在受限网络(如低数据模式)上执行请求- 这两个属性替代了传统的网络类型检查
- 系统会根据用户的蜂窝套餐和数据模式设置自动推导”昂贵”和”受限”状态
使用高级框架充分利用 5G
(09:46)Apple 的高级网络框架已经针对 5G 做了优化:
// AVFoundation 自动适配 5G 高带宽
let playerItem = AVPlayerItem(url: highQualityVideoURL)
let player = AVPlayer(playerItem: playerItem)
// 系统会自动在 5G 下请求更高码率的视频流
// URLSession 在 5G 下自动使用更激进的缓存策略
let config = URLSessionConfiguration.default
config.allowsExpensiveNetworkAccess = true
let session = URLSession(configuration: config)
// 大文件下载任务
let downloadTask = session.downloadTask(with: largeFileURL)
downloadTask.resume()
关键点:
AVFoundation在 5G 下会自动请求更高质量的视频流,类似 Apple TV 和 Apple Music 的行为CallKit针对 5G 下的 VoIP 做了延迟优化URLSession和Network框架已经过调优,可以自动利用 5G 的高带宽- Apple News 在 5G 下会缓存文章供离线阅读,iCloud 照片会在 5G 下同步,系统备份在 Wi-Fi 不可用时自动通过 5G 进行
适配受限和昂贵网络路径
(10:39)用户在设置中可以选择三种数据模式:
| 数据模式 | 网络特性 | 适用场景 |
|---|---|---|
| Allow More Data on 5G | 不昂贵,类似 Wi-Fi | 无限流量套餐 |
| Standard | 昂贵 | 普通流量套餐 |
| Low Data Mode | 受限 | 漫游或流量紧张 |
在 Network 框架中检查网络特性:
import Network
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
if path.isConstrained {
// 低数据模式:暂停非必要下载,降低图片质量
self.reduceDataUsage()
} else if path.isExpensive {
// 昂贵网络:询问用户是否继续大文件下载
self.promptForExpensiveDownload()
} else {
// 不昂贵网络:正常使用,可以预加载内容
self.enableAggressivePrefetching()
}
}
monitor.start(queue: DispatchQueue.global())
关键点:
NWPath的isExpensive表示当前网络路径是否昂贵(通常指按流量计费的蜂窝)NWPath的isConstrained表示是否处于低数据模式- 这两个属性是判断网络服务可用性的唯一依据
- 如果应用实现了基于”昂贵”的策略,应提供设置项让用户覆盖
5G 网络类型简介
(05:15)5G 部署主要有两种模式:
- NSA(Non-Standalone):基于现有 LTE 核心网,同时使用 LTE 和 5G 链路调度流量,支持 sub-7GHz 和毫米波
- SA(Standalone):完全基于新 5G 核心网,同样支持 sub-7GHz 和毫米波,延迟比 LTE 更低
Apple Park 的实测速度达到了 3Gbps,是 LTE 的 20 倍,ping 延迟仅 7 毫秒。但 5G 比 LTE 更耗电,系统会在性能和功耗之间自动平衡。
核心启发
-
自适应媒体质量:在视频播放应用中,根据
isExpensive和isConstrained动态调整视频码率。5G 不限量套餐用户自动播放 4K,标准模式播放 1080p,低数据模式降到 720p 或暂停自动播放。入口 API:NWPathMonitor+AVPlayerItem的 preferredPeakBitRate。 -
智能预加载:在新闻或社交应用中,当网络不昂贵时预加载下几页内容和高清图片;检测到昂贵或受限网络时停止预加载,只加载用户明确请求的内容。用
allowsExpensiveNetworkAccess控制后台URLSession的行为。 -
5G 低延迟多人游戏:利用 5G 的 7 毫秒级延迟开发实时对战游戏。配合
Network框架的NWConnection建立 QUIC 连接,减少握手延迟。在体育场等拥挤场所,系统会自动切换到 5G 避免 Wi-Fi 拥塞。 -
后台大文件传输策略:在云盘或文件同步应用中,大文件上传下载使用
URLSessionDownloadTask的后台模式。配合allowsExpensiveNetworkAccess属性,让用户在设置中选择”允许蜂窝网络同步”。检测到 5G 且网络不昂贵时,自动开启全速同步。
关联 Session
- Meet async/await in Swift — Swift 并发编程的新范式
- What’s new in URLSession — URLSession 的新特性和最佳实践
- Get ready for iCloud Private Relay — iCloud Private Relay 的网络影响
- Network extensions for the modern Mac — macOS 网络扩展的新能力
评论
GitHub Issues · utterances