在Swift 2中获取SSID

我试图使用这个代码来获取SSID

import Foundation import SystemConfiguration.CaptiveNetwork public class SSID { class func getSSID() -> String{ var currentSSID = "" let interfaces = CNCopySupportedInterfaces() if interfaces != nil { let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject] if interfacesArray.count > 0 { let interfaceName = interfacesArray[0] as String 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 } } 

但是,在这一行中得到一个错误, let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]

错误是

Value of type 'CFArray?' has no member 'takeRetainedValue'

谢谢你的帮助

这可能会帮助你(在Swift 2上testing):

 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 } } 

我采取并修改了Ray Wenderlich网站的代码(曾经在这里: 在iOS9中检索SSID,但是现在特定的线程已经从网站中删除)

这是我的解决schemeSwift 3 iOS 10 ,它适用于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 } } 

要使用它:

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

PS:注意它不适用于模拟器

目前所提出的解决scheme似乎相当复杂,丑陋的不安全的演员阵容。

我能够制作出这样一个简洁的解决scheme(根本没有黑魔法):

 import Foundation import SystemConfiguration.CaptiveNetwork func getSSID() -> 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 } 

在Swift 3中(在真实设备和模拟器中工作):

 import SystemConfiguration.CaptiveNetwork internal class SSID { class func fetchSSIDInfo() -> String { var currentSSID = "" if let interfaces:CFArray = 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 unsafeInterfaceData != nil { let interfaceData = unsafeInterfaceData! as Dictionary! currentSSID = ((interfaceData as? [String : AnyObject])?["SSID"])! as! String } } } return currentSSID } } 

用法:

 SSID.fetchSSIDInfo() //will return "" if no connected wifi or running in simulator 

在swift 2中,您不必调用takeRetainedValue

使用Array(arrayLiteral: interfaces)将代码interfaces.takeRetainedValue() as [String : AnyObject]replaceinterfaces.takeRetainedValue() as [String : AnyObject]

还要记住将代码interfacesArray[0] as String更改为String(interfacesArray[0])

完整代码:

 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 } 

}

以下函数返回wifi名称和Mac地址

  func getNetworkInfo()->(success:Bool,ssid:String,mac:String){ var currentSSID:String = "" var macAdrees:String = "" var succes:Bool = false let interfaces:CFArray! = 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 macAdrees = interfaceData["BSSID"] as! String succes = true } else { currentSSID = "" } } return (succes, currentSSID, macAdrees) } 

这段代码工作正常。 你会注意到你的开发目标> = iOS9的一些警告

https://stackoverflow.com/users/3108877/rob的答&#x6848; – 较短的版本

 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 }