iosswiftwifibssid

How to Get iOS BSSID


Hi guys I need to get BSSID of wifi network on iPhone with iOS 12 with SWIFT. I tested something like this

func getWiFiSsid() -> 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


        }
    }
}
return ssid}

I have enabled Access WiFi Information capability but still get NIL

Thank you for any help

UPDATE 26.11.2018

This is my ViewController.swift

import UIKit
import SystemConfiguration.CaptiveNetwork

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


    }
    func getSSID() -> String? {
        guard let interface = (CNCopySupportedInterfaces() as? [String])?.first,
            let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interface as CFString) as? [String: Any],
            let ssid = unsafeInterfaceData["SSID"] as? String else{
                return nil
        }
        return ssid
    }



    // Return IP address of WiFi interface (en0) as a String, or `nil`
    func getWiFiAddress() -> String? {
        var address : String?

        // Get list of all interfaces on the local machine:
        var ifaddr : UnsafeMutablePointer<ifaddrs>?
        guard getifaddrs(&ifaddr) == 0 else { return nil }
        guard let firstAddr = ifaddr else { return nil }

        // For each interface ...
        for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
            let interface = ifptr.pointee

            // Check for IPv4 or IPv6 interface:
            let addrFamily = interface.ifa_addr.pointee.sa_family
            if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {

                // Check interface name:
                let name = String(cString: interface.ifa_name)
                if  name == "en0" {

                    // Convert interface address to a human readable string:
                    var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                    getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),
                                &hostname, socklen_t(hostname.count),
                                nil, socklen_t(0), NI_NUMERICHOST)
                    address = String(cString: hostname)
                }
            }
        }
        freeifaddrs(ifaddr)
        return address
    }

    func getWiFiSsid() -> 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
                }
            }
        }
        return ssid
    }

    func getSSIDtwo() -> String? {
        let interfaces = CNCopySupportedInterfaces()
        if interfaces == nil {
            //print("Not interfaces")
            return nil
        }

        let interfacesArray = interfaces as! [String]
        if interfacesArray.count <= 0 {
            return nil
        }
        let interfaceName = interfacesArray[0] as String
        let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName as CFString)
        if unsafeInterfaceData == nil {
            return nil
        }

        let interfaceData = unsafeInterfaceData as! Dictionary <String,AnyObject>
        return interfaceData["SSID"] as? String
    }

    @IBAction func onButtonClick(_ sender: Any) {
        let one = getWiFiSsid();
        let two = getSSIDtwo();
        let three = getSSID();

        print(one);
        print(two);
        print(three);
    }}

Solution

  • This the code I use with Access WiFi turned on. You will see that I get the first item in the array to and get the SSID from it.

    func getSSID() -> String? {
            let interfaces = CNCopySupportedInterfaces()
            if interfaces == nil {
                //print("Not interfaces")
                return nil
            }
    
            let interfacesArray = interfaces as! [String]
            if interfacesArray.count <= 0 {
                return nil
            }
            let interfaceName = interfacesArray[0] as String
            let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName as CFString)
            if unsafeInterfaceData == nil {
                return nil
            }
    
            let interfaceData = unsafeInterfaceData as! Dictionary <String,AnyObject>
            return interfaceData["SSID"] as? String
        }
    

    When I use your code which is smaller and cleaner it works for me as well. Note I did make two changes to your code:

    func getWiFiSsid() -> String? {
        if let interfaces = CNCopySupportedInterfaces() as NSArray? {
            for interface in interfaces {
                if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
                    // Changed line below from the "ssid =" to return the value directly.
                    return interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
                }
            }
        }
        // Changed this to return nil
        return nil
    }