Get SSID in Swift 2

前端 未结 10 1296
情书的邮戳
情书的邮戳 2020-12-05 05:36

Im trying to use this code to get SSID

import Foundation
import SystemConfiguration.CaptiveNetwork

public class SSID {
    class func getSSID() -> String         


        
相关标签:
10条回答
  • 2020-12-05 06:05

    This is my solution Swift 3 iOS 10 and it works well with Xcode 8

    import Foundation
    
    import SystemConfiguration.CaptiveNetwork
    
    class network : NSObject {
    
        func getSSID() -> String? {
    
            let interfaces = CNCopySupportedInterfaces()
            if interfaces == nil {
                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
        }
    
    }
    

    To use it:

    let wifiName = network().getSSID()
    
        guard wifiName != nil else {
    
            //// TODO: Alert -----
            print("no wifi name")
    
            return
        }
    
    
        print("my network name is: \(wifiName!)")
    

    PS: Attention it not works on simulator

    0 讨论(0)
  • 2020-12-05 06:11

    You can find an another answer with updated Swift standards of @japes answer which supports both Swift 3 and Swift 4. Return empty "" on simulators.

    import SystemConfiguration.CaptiveNetwork
    
    internal class SSID {
    
        class func fetchSSIDInfo() -> 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)
                    guard let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString) else {
                        return currentSSID
                    }
                    guard let interfaceData = unsafeInterfaceData as? [String: Any] else {
                        return currentSSID
                    }
                    guard let SSID = interfaceData["SSID"] as? String else {
                        return currentSSID
                    }
                    currentSSID = SSID
                }
            }
            return currentSSID
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 06:12

    In swift 2, you don't have to call takeRetainedValue.

    Replace the code interfaces.takeRetainedValue() as [String : AnyObject] with Array(arrayLiteral: interfaces).

    Also remember change the code interfacesArray[0] as String into String(interfacesArray[0]).

    Full code :

    public class SSID {
    class func getSSID() -> String{
        var currentSSID = ""
        let interfaces = CNCopySupportedInterfaces()
        if interfaces != nil {
            let interfacesArray = Array(arrayLiteral: interfaces)
            if interfacesArray.count > 0 {
                let interfaceName =  String(interfacesArray[0])
                let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName)
                if unsafeInterfaceData != nil {
                    let interfaceData = unsafeInterfaceData.takeRetainedValue() as Dictionary!
                    currentSSID = interfaceData[kCNNetworkInfoKeySSID] as! String
                    let ssiddata = NSString(data:interfaceData[kCNNetworkInfoKeySSIDData]! as! NSData, encoding:NSUTF8StringEncoding) as! String
                    // ssid data from hex
                    print(ssiddata)
                }
            }
        }
        return currentSSID
    }
    

    }

    0 讨论(0)
  • 2020-12-05 06:12

    Grabbing WiFi Network SSID and BSSID in Swift

    I have seen a lot of versions of this very popular question using the SystemConfiguration framework. Reading through this list of answers I've found that they're all over the place. Unsafe-bit casting, magic strings, weird coercion. Any time an API returns CFArray or CFDictionary use toll-free bridging to get an NS{Array,Dictionary}. It allows you to avoid some of the uglier aspects (in the context of Swift) of CoreFoundation. Also you should use the constants defined in the header for the SSID and BSSID dictionary values. Absolutely no need for the Unsafe types here, all of the data types are well-defined. That said, the CaptiveNetwork version of this code is deprecated in iOS 14 and it is recommended you use the NetworkExtension framework instead.

    NEHotspotNetwork

    import NetworkExtension
    
    NEHotspotNetwork.fetchCurrent { hotspotNetwork in
        if let ssid = hotspotNetwork?.ssid {
            print(ssid)
        }
    }
    

    Deprecated - CaptiveNetwork Method

    import SystemConfiguration.CaptiveNetwork
    
    func getWiFiNetwork() -> (ssid: String, bssid: String)?
    {
        var wifiNetwork: (ssid: String, bssid: String)?
        if let interfaces = CNCopySupportedInterfaces() as NSArray? {
            for interface in interfaces {
                let name = interface as! CFString
                if let interfaceData = CNCopyCurrentNetworkInfo(name) as NSDictionary? {
                    if let ssid = interfaceData[kCNNetworkInfoKeySSID] as? String,
                        let bssid = interfaceData[kCNNetworkInfoKeyBSSID] as? String {
                        wifiNetwork = (ssid: ssid, bssid: bssid)
                    }
                }
            }
        }
        
        return wifiNetwork
    }
    

    Permissions - CoreLocation

    In terms of user permissions you have possibilities, but you need one of four defined in the documentation for CNCopyCurrentNetworkInfo or fetchCurrent - for most cases I assume you will need to add CoreLocation and ask for permission to use the user's location. For example, Privacy - Location When In Use Usage Description in the Info.plist needs a reason for why you require the user's location and then you must make the call to request the user authorization dialog.

        import CoreLocation
    
        CLLocationManager().requestWhenInUseAuthorization()
    

    Entitlements

    Your app also need the entitlement - com.apple.developer.networking.wifi-info which is added in Signing and Capabilities section of the project and is called Access WiFi Information. When using NEHotspotNetwork method there is an additional Network Extensions entitlement required.

    0 讨论(0)
  • 2020-12-05 06:20

    This may help you (tested on Swift 2):

    import Foundation
    import SystemConfiguration.CaptiveNetwork
    
    public class SSID {
        class func fetchSSIDInfo() -> String {
            var currentSSID = ""
            if let interfaces = CNCopySupportedInterfaces() {
                for i in 0..<CFArrayGetCount(interfaces) {
                    let interfaceName: UnsafePointer<Void> = CFArrayGetValueAtIndex(interfaces, i)
                    let rec = unsafeBitCast(interfaceName, AnyObject.self)
                    let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)")
                    if unsafeInterfaceData != nil {
                        let interfaceData = unsafeInterfaceData! as Dictionary!
                        currentSSID = interfaceData["SSID"] as! String
                    }
                }
            }
            return currentSSID
        }
    }
    

    I took and adapted the code from Ray Wenderlich's site (once was here: Retrieve SSID in iOS9 but now the specific thread has been removed from site)

    iOS 12

    You must enable Access WiFi Information from capabilities.

    Important To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID. Documentation link

    Swift4.2

    public class SSID {
        class func fetchSSIDInfo() -> String {
            var currentSSID = ""
            if let interfaces = CNCopySupportedInterfaces() {
                for i in 0..<CFArrayGetCount(interfaces) {
                    let interfaceName: UnsafeRawPointer = 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
        }
    }
    
    0 讨论(0)
  • 2020-12-05 06:22

    https://stackoverflow.com/users/3108877/rob's answer -- shorter version

    func getSSID() -> String? {
            if let interface = (CNCopySupportedInterfaces() as? [String])?.first,
                let unsafeInterfaceData = CNCopyCurrentNetworkInfo(interface as CFString) as? [String: Any],
                let ssid = unsafeInterfaceData["SSID"] as? String {
                return ssid
            }
            return nil
        }
    
    0 讨论(0)
提交回复
热议问题