iOS开发:如何获取可用WiFi网络列表并实现点击连接功能?
嘿,我来帮你拆解iOS下WiFi相关的这两个问题——其实核心都绕不开苹果的隐私和权限限制,得先把规则说清楚:
一、获取所有可用WiFi网络名称列表
首先要明确:普通App(没有特殊权限)根本无法获取所有可用的WiFi列表,这是苹果严格的隐私限制,目的是防止App通过WiFi信息追踪用户位置。
你能做的只有获取当前设备已经连接的WiFi信息,具体实现如下:
- 首先在Xcode的Capabilities中开启
Access WiFi Information权限; - 其次,iOS 13及以上版本需要用户授予位置权限(因为WiFi SSID可能被用于定位),所以要在
Info.plist中添加NSLocationWhenInUseUsageDescription或NSLocationAlwaysAndWhenInUseUsageDescription字段,说明获取位置的用途; - 最后用系统API获取当前WiFi名称:
import SystemConfiguration.CaptiveNetwork func getCurrentConnectedWiFi() -> String? { guard let interfaces = CNCopySupportedInterfaces() as? [CFString] else { return nil } for interface in interfaces { guard let networkInfo = CNCopyCurrentNetworkInfo(interface) as? [CFString: Any] else { continue } return networkInfo[kCNNetworkInfoKeySSID] as? String } return nil }
如果一定要获取所有可用WiFi列表,只有两种特殊情况能做到:
- 你的App属于MFi(Made for iPhone/iPad)计划中的特定品类(比如WiFi硬件配件的配套App);
- 你的App是企业级内部应用,且向苹果提交了特殊权限申请并获得通过(这个难度极高,只有明确的企业内部需求才可能获批);
满足以上任一条件后,你可以使用NEHotspotHelper框架来扫描附近的WiFi网络。
二、开发“获取WiFi列表+点击连接”的App是否可行?如何实现?
同样分两种情况:
普通App(无特殊权限):不可行
你无法扫描到所有可用WiFi列表,只能让用户手动输入SSID和密码,然后调用NEHotspotConfiguration框架来连接WiFi,代码示例:
import NetworkExtension func connectToWiFi(ssid: String, password: String, isWEP: Bool = false) { let config = NEHotspotConfiguration(ssid: ssid, passphrase: password, isWEP: isWEP) config.joinOnce = false // 设置为false表示记住该WiFi,下次自动连接 NEHotspotConfigurationManager.shared.apply(config) { error in if let error = error { print("连接失败:\(error.localizedDescription)") } else { print("WiFi连接成功") } } }
注意:这个方法要求iOS 11及以上版本,且如果WiFi是隐藏网络,还需要额外配置hiddenSSID参数。
拥有特殊权限的App:可行
如果你的App符合MFi或企业特殊权限要求,实现步骤如下:
- 向苹果申请
NEHotspotHelper权限,提交App的用途说明,获得授权后才能使用该框架; - 在Xcode中开启
NetworkExtension的Hotspot HelperCapability; - 使用
NEHotspotHelper扫描附近WiFi,获取SSID、BSSID、信号强度等信息; - 结合
NEHotspotConfiguration实现点击连接的功能(代码和上面的普通App连接代码类似);
需要特别提醒:NEHotspotHelper的扫描逻辑是由系统触发的,不是你想扫就能扫,系统会根据场景调度扫描请求,而且返回的WiFi列表也会受到隐私限制(比如隐藏网络不会被返回)。
内容的提问来源于stack exchange,提问作者Akash




