Im trying to use this code to get SSID
import Foundation
import SystemConfiguration.CaptiveNetwork
public class SSID {
class func getSSID() -> String
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
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
}
}
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
}
}
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.
import NetworkExtension
NEHotspotNetwork.fetchCurrent { hotspotNetwork in
if let ssid = hotspotNetwork?.ssid {
print(ssid)
}
}
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
}
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()
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.
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
}
}
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
}