如何使用 iOS 13 在 iOS 设备中获取 SSID

How to fetch SSID in iOS device with iOS 13

我有一个 Objective-C iPhone 应用程序,目前我正在使用下面的代码来获取连接的 Wifi 名称。但它在 iOS 13 中不起作用。如何在 iOS 13 中获取连接的 Wifi SSID?

目前我在Swift中使用下面的代码:

public class SSID {
class func fetch() -> String {
    var currentSSID = ""
    if let interfaces = CNCopySupportedInterfaces() {
        for i in 0..<CFArrayGetCount(interfaces) {
            let interfaceName = CFArrayGetValueAtIndex(interfaces, i)
            let rec = unsafeBitCast(interfaceName, to: AnyObject.self)
            let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)
            if let interfaceData = unsafeInterfaceData as? [String: AnyObject] {
                currentSSID = interfaceData["SSID"] as! String
                let BSSID = interfaceData["BSSID"] as! String
                let SSIDDATA = interfaceData["SSIDDATA"] as! String
                debugPrint("ssid=\(currentSSID), BSSID=\(BSSID), SSIDDATA=\(SSIDDATA)")
            }
        }
    }
    return currentSSID
  }
}

但是此代码在 iOS13 中返回 nil,在此先感谢!

使用 iOS 14 上提供的代码,我得到以下错误:

nehelper sent invalid result code [1] for Wi-Fi information request

搜索该错误将我带到这个

Solution:

The requesting app must meet one of the following requirements:

The app uses Core Location, and has the user’s authorization to use location information.

The app uses the NEHotspotConfiguration API to configure the current Wi-Fi network.

The app has active VPN configurations installed.

An app that fails to meet any of the above requirements receives the following return value:

An app linked against iOS 12 or earlier receives a dictionary with pseudo-values. In this case, the SSID is Wi-Fi (or WLAN in the China region), and the BSSID is 00:00:00:00:00:00.

An app linked against iOS 13 or later receives NULL.

Important

To use this function, an app linked against iOS 12 or later must enable the Access WiFi Information capability in Xcode.

我还确认,一旦您请求位置许可,这实际上适用于 iOS 14。

import CoreLocation
import UIKit
import SystemConfiguration.CaptiveNetwork

final class ViewController: UIViewController {
  var locationManager: CLLocationManager?

  override func viewDidLoad() {
    super.viewDidLoad()

    locationManager = CLLocationManager()
    locationManager?.delegate = self
    locationManager?.requestAlwaysAuthorization()
  }

  func getWiFiName() -> String? {
    var ssid: String?

    if let interfaces = CNCopySupportedInterfaces() as NSArray? {
      for interface in interfaces {
        if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
          ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
          break
        }
      }
    }

    return ssid
  }
}

extension ViewController: CLLocationManagerDelegate {
  func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedAlways || status == .authorizedAlways {
      let ssid = self.getWiFiName()
      print("SSID: \(String(describing: ssid))")
    }
  }
}

输出:SSID: YaMomsWiFi

不要忘记在您的 plist 中包含 wifi 权利和必要的密钥以获取位置权限。