在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的答案 – 较短的版本
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 }