Optimize for 5G networks
System & Services 进阶 20m

针对 5G 网络优化你的 App

Optimize for 5G networks

2021年6月11日

在 Apple 官方观看视频

一句话判断

5G 不只是”更快的 4G” —— 苹果提供了 NWPathMonitor 的 5G 感知能力和 URLSession 的 allowsExpensiveNetworkAccess 属性,让你根据网络类型和资费状态做出不同的数据加载策略,这才是这集 Session 的真正价值。

这场 Session 讲了什么

Session 讲解了如何针对 5G 网络优化 app 的网络行为。5G 的特点是高带宽(理论峰值 10Gbps)和低延迟(1ms 级),但也有独特约束:流量可能很贵(非无限流量套餐)、功耗比 4G 高、覆盖不均匀。

核心 API 更新包括:NWPath 新增了 isExpensiveisConstrained 属性,告诉你当前网络是否昂贵(蜂窝)或受限(低数据模式);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
}

最佳实践

  1. 尊重 isConstrained 标志。如果用户开了低数据模式,不要偷跑后台下载。这不仅是最佳实践,更是用户信任的基础 —— 违反这个规则会导致差评。
  2. 为 5G 用户提供”高清模式”开关。在设置中让用户选择”在蜂窝网络下加载高清内容”,默认关闭。这比自动判断更透明。
  3. 大文件下载使用 URLSessionDownloadTask 的后台模式。即使用户切到后台,下载也能继续。配合 allowsExpensiveNetworkAccess 控制蜂窝下载行为。

还有什么值得关注

  • iOS 15 新增了 NWPath.supportsIPv4supportsIPv6 属性,帮助判断网络的协议支持。
  • 5G 的毫米波(mmWave)在信号弱时会快速回退到 Sub-6GHz,不要假设 5G 一定是高带宽。
  • NetworkExtension 框架在 iOS 15 中支持了 5G 网络扩展插件的开发。
WWDC 2021