针对 5G 网络优化你的 App
Optimize for 5G networks
2021年6月11日
一句话判断
5G 不只是”更快的 4G” —— 苹果提供了 NWPathMonitor 的 5G 感知能力和 URLSession 的 allowsExpensiveNetworkAccess 属性,让你根据网络类型和资费状态做出不同的数据加载策略,这才是这集 Session 的真正价值。
这场 Session 讲了什么
Session 讲解了如何针对 5G 网络优化 app 的网络行为。5G 的特点是高带宽(理论峰值 10Gbps)和低延迟(1ms 级),但也有独特约束:流量可能很贵(非无限流量套餐)、功耗比 4G 高、覆盖不均匀。
核心 API 更新包括:NWPath 新增了 isExpensive 和 isConstrained 属性,告诉你当前网络是否昂贵(蜂窝)或受限(低数据模式);URLSession 的 allowsExpensiveNetworkAccess 控制是否在蜂窝网络下执行后台传输;allowsConstrainedNetworkAccess 控制低数据模式下的行为。
还讨论了 5G 场景下的最佳实践:大文件下载策略、流媒体自适应、以及如何利用 5G 的高带宽做更丰富的预加载。
值得深挖的点
isConstrained 的实际含义。iOS 13 引入了”低数据模式”(Low Data Mode),用户可以在蜂窝网络设置中开启。当开启后,NWPath.isConstrained 返回 true。这个状态意味着用户希望 app 减少网络活动。URLSession 默认在 constrained 网络下不执行后台传输。你需要在 URLSessionConfiguration 中显式设置 allowsConstrainedNetworkAccess = true 来覆盖这个行为,但苹果强烈建议尊重用户的选择。
5G 感知的内容预加载策略。在 5G 高带宽环境下,你可以预加载更多内容(如视频的更高清版本、下一集电视剧、地图的更精细瓦片)。但判断是否应该预加载不只看带宽,还要看 isExpensive。如果用户在按流量计费的 5G 网络上,预加载 4K 视频会让用户下个月话费暴涨。
代码片段
检测网络类型和约束条件:
import Network
class NetworkMonitor {
let monitor = NWPathMonitor()
var currentPath: NWPath?
func startMonitoring() {
monitor.pathUpdateHandler = { path in
self.currentPath = path
// 检查网络特性
if path.usesInterfaceType(.cellular) {
print("当前使用蜂窝网络(可能是 5G)")
if path.isExpensive {
print("这是昂贵网络(消耗流量)")
}
if path.isConstrained {
print("用户开启了低数据模式")
}
} else if path.usesInterfaceType(.wifi) {
print("当前使用 Wi-Fi")
}
}
monitor.start(queue: DispatchQueue(label: "network.monitor"))
}
}
根据网络状态配置 URLSession:
import Foundation
func createAdaptiveSession(networkPath: NWPath) -> URLSession {
let config = URLSessionConfiguration.default
if networkPath.isExpensive && !networkPath.isConstrained {
// 5G 蜂窝,但用户没有开低数据模式
// 可以适当预加载,但要控制总量
config.timeoutIntervalForRequest = 15
config.httpMaximumConnectionsPerHost = 4
} else if networkPath.isConstrained {
// 低数据模式,只加载必要内容
config.allowsConstrainedNetworkAccess = false
config.timeoutIntervalForRequest = 30
} else {
// Wi-Fi 环境,尽情预加载
config.httpMaximumConnectionsPerHost = 8
}
// 后台传输的配置
config.allowsExpensiveNetworkAccess = true
config.waitsForConnectivity = true
return URLSession(configuration: config)
}
5G 环境下的视频预加载:
import AVFoundation
func configureVideoPreload(networkPath: NWPath) -> AVURLAsset {
let url = URL(string: "https://stream.example.com/video.mp4")!
let asset = AVURLAsset(url: url)
// 根据网络条件选择预加载策略
let resourceLoader = asset.resourceLoader
if !networkPath.isExpensive {
// Wi-Fi 环境:预加载大量数据
asset.resourceLoader.preloadsEligibleContentKeys = true
} else if !networkPath.isConstrained {
// 5G 蜂窝(非低数据模式):适度预加载
// 只预加载前 30 秒
}
// 低数据模式:不预加载,按需请求
return asset
}
最佳实践
- 尊重
isConstrained标志。如果用户开了低数据模式,不要偷跑后台下载。这不仅是最佳实践,更是用户信任的基础 —— 违反这个规则会导致差评。 - 为 5G 用户提供”高清模式”开关。在设置中让用户选择”在蜂窝网络下加载高清内容”,默认关闭。这比自动判断更透明。
- 大文件下载使用
URLSessionDownloadTask的后台模式。即使用户切到后台,下载也能继续。配合allowsExpensiveNetworkAccess控制蜂窝下载行为。
还有什么值得关注
- iOS 15 新增了
NWPath.supportsIPv4和supportsIPv6属性,帮助判断网络的协议支持。 - 5G 的毫米波(mmWave)在信号弱时会快速回退到 Sub-6GHz,不要假设 5G 一定是高带宽。
NetworkExtension框架在 iOS 15 中支持了 5G 网络扩展插件的开发。