Mac Catalyst开发中如何选择指定连接网络发起对外请求
Mac Catalyst 指定网络请求实现方案
Apple 原生提供了完整的 API 支持你的需求,核心基于系统的 Network 框架和 URLSession 相关能力实现,无需引入第三方依赖。
1. 已连接网络检测
使用 NWPathMonitor 可以枚举当前设备所有已激活的网络接口,支持区分 Wi-Fi、以太网、蜂窝网络、VPN 等不同接口类型,同时可以获取接口名称、IP 地址、路由可用性等参数。
示例代码如下:
import Network // 初始化全局网络路径监控 let networkMonitor = NWPathMonitor() networkMonitor.pathUpdateHandler = { currentPath in // 遍历所有可用的网络接口 for interface in currentPath.availableInterfaces { print("接口名称:\(interface.name),接口类型:\(interface.type)") // interface.type 为枚举值,包含 wifi、cellular、wiredEthernet、loopback 等常见类型 } } // 启动监控,指定回调队列 networkMonitor.start(queue: DispatchQueue(label: "network.monitor.queue"))
如果只需要监控特定类型的网络,也可以在初始化时指定类型:NWPathMonitor(requiredInterfaceType: .wiredEthernet)。
2. 强制请求走指定网络
根据你使用的网络请求工具,有两种成熟的实现方案:
- 基于
URLSession实现(适配绝大多数网络请求场景):
macOS 12+/iOS 15+ 以上系统,URLSessionConfiguration提供了requiredInterface属性,直接绑定你筛选出的目标网络接口后,该URLSession实例发起的所有请求都会强制走指定接口,不会走系统默认路由的其他网络。
示例代码如下:// 此处的 targetInterface 是你通过 NWPathMonitor 筛选出的指定网络接口 guard let targetInterface = networkMonitor.currentPath.availableInterfaces.first(where: { $0.type == .wiredEthernet }) else { return } let sessionConfig = URLSessionConfiguration.ephemeral sessionConfig.requiredInterface = targetInterface // 禁止自动使用其他可用接口 fallback sessionConfig.allowsConstrainedNetworkAccess = false sessionConfig.allowsExpensiveNetworkAccess = false let customSession = URLSession(configuration: sessionConfig) // 后续所有网络请求都使用该 customSession 实例即可,不要使用默认的 URLSession.shared - 基于
NWConnection实现(适配自定义协议、低层级网络请求场景):
初始化NWConnection时直接指定requiredInterface参数,即可强制该连接的所有流量走指定网络接口,兼容 macOS 10.15+/iOS 13+ 以上系统。
注意:如果需要全局限制所有网络请求的路由,务必不要使用系统提供的共享
URLSession.shared实例,所有请求都走你自行创建的绑定了指定接口的URLSession实例,避免流量泄露到其他网络。
内容的提问来源于stack exchange,提问作者hgwhittle
相关产品推荐
相关产品推荐

