返回

告别iOS 13局限,轻松获取WiFi SSID和BSSID!

IOS

一直在手机上使用WiFi连接网络,却对WiFi的信息一无所知?





在不久前,苹果发送了一封邮件,通知开发者,在iOS 13中,CNCopyCurrentNetworkInfo接口将不再返回WiFi SSID和BSSID的信息。这一消息对于物联网相关应用程序来说是一个不小的挑战,因为这些应用程序通常需要获取WiFi SSID和BSSID信息才能正常工作。


不过,苹果也在邮件中提供了解决方案。他们表示,如果应用程序已经打开了位置权限,则仍然可以获取WiFi SSID和BSSID信息。因此,对于那些需要获取WiFi SSID和BSSID信息的物联网应用程序,只需在用户允许的前提下,先获取用户的位置权限,然后就可以通过CNCopyCurrentNetworkInfo接口获取WiFi SSID和BSSID的信息了。


下面是一个示例,演示了如何在Swift中获取WiFi SSID和BSSID的信息:


import CoreLocation
import SystemConfiguration.CaptiveNetwork

class ViewController: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == .authorizedWhenInUse {
            getWiFiInfo()
        }
    }

    func getWiFiInfo() {
        guard let interfaces = CNCopySupportedInterfaces() as? [String] else {
            return
        }

        for interface in interfaces {
            guard let info = CNCopyCurrentNetworkInfo(interfaceName: interface) as? [String: AnyObject] else {
                continue
            }

            guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else {
                continue
            }

            guard let bssid = info[kCNNetworkInfoKeyBSSID as String] as? String else {
                continue
            }

            print("SSID: \(ssid)")
            print("BSSID: \(bssid)")
        }
    }
}

在这个示例中,我们首先获取了用户的位置权限,然后通过CNCopySupportedInterfaces()函数获取了所有支持的网络接口。接下来,我们遍历这些网络接口,并通过CNCopyCurrentNetworkInfo()函数获取每个网络接口的当前网络信息。最后,我们从网络信息中提取出WiFi SSID和BSSID的信息,并将其打印到控制台。


需要注意的是,如果应用程序没有打开位置权限,则无法获取WiFi SSID和BSSID的信息。因此,在使用CNCopyCurrentNetworkInfo()函数之前,一定要确保应用程序已经打开了位置权限。