You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS开发:如何获取可用WiFi网络列表并实现点击连接功能?

嘿,我来帮你拆解iOS下WiFi相关的这两个问题——其实核心都绕不开苹果的隐私和权限限制,得先把规则说清楚:

一、获取所有可用WiFi网络名称列表

首先要明确:普通App(没有特殊权限)根本无法获取所有可用的WiFi列表,这是苹果严格的隐私限制,目的是防止App通过WiFi信息追踪用户位置。

你能做的只有获取当前设备已经连接的WiFi信息,具体实现如下:

  • 首先在Xcode的Capabilities中开启Access WiFi Information权限;
  • 其次,iOS 13及以上版本需要用户授予位置权限(因为WiFi SSID可能被用于定位),所以要在Info.plist中添加NSLocationWhenInUseUsageDescriptionNSLocationAlwaysAndWhenInUseUsageDescription字段,说明获取位置的用途;
  • 最后用系统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或企业特殊权限要求,实现步骤如下:

  1. 向苹果申请NEHotspotHelper权限,提交App的用途说明,获得授权后才能使用该框架;
  2. 在Xcode中开启NetworkExtensionHotspot Helper Capability;
  3. 使用NEHotspotHelper扫描附近WiFi,获取SSID、BSSID、信号强度等信息;
  4. 结合NEHotspotConfiguration实现点击连接的功能(代码和上面的普通App连接代码类似);

需要特别提醒:NEHotspotHelper的扫描逻辑是由系统触发的,不是你想扫就能扫,系统会根据场景调度扫描请求,而且返回的WiFi列表也会受到隐私限制(比如隐藏网络不会被返回)。

内容的提问来源于stack exchange,提问作者Akash

火山引擎 最新活动