我试图使用此代码获取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'
感谢您的帮助
答案 0 :(得分:24)
这可能会对你有帮助(在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
}
}
我接受并调整了Ray Wenderlich网站的代码(曾经在这里: Retrieve SSID in iOS9但现在特定线程已从网站中删除了
iOS 12
您必须从功能启用Access WiFi信息。
重要 要在iOS 12及更高版本中使用此功能,请在Xcode中为您的应用启用Access WiFi信息功能。启用此功能后,Xcode会自动将Access WiFi信息权利添加到您的权利文件和应用程序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
}
}
答案 1 :(得分:13)
这是我的解决方案 Swift 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:注意它不适用于模拟器
答案 2 :(得分:6)
此刻呈现的所有解决方案看起来相当复杂,丑陋的不安全演员阵容。
我能够制作出如此简洁的解决方案(根本没有黑魔法):
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
}
答案 3 :(得分:5)
在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
答案 4 :(得分:1)
在swift 2中,您不必致电takeRetainedValue
。
将代码interfaces.takeRetainedValue() as [String : AnyObject]
替换为Array(arrayLiteral: interfaces)
。
另请记住将代码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
}
}
答案 5 :(得分:1)
Swift 4版本
import SystemConfiguration.CaptiveNetwork
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
}
答案 6 :(得分:0)
以下函数返回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)
}
此代码工作正常。您将在开发目标&gt; = iOS9
中注意到一些警告答案 7 :(得分:0)
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
}
答案 8 :(得分:0)
你可以找到另一个答案,更新了Swift标准的@japes答案,它支持 Swift 3 和 Swift 4 。在模拟器上返回空""
。
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
}
}
答案 9 :(得分:0)
我已经使用SystemConfiguration
框架看到了这个非常受欢迎的问题的许多版本。仔细阅读这份答案清单,我发现它们无处不在。不安全的位转换,魔术弦,奇怪的强制。每当API返回CFArray
或CFDictionary
时,请使用免费桥接获取NS{Array,Dictionary}
。它使您可以避免CoreFoundation
的某些较丑陋的方面(在Swift中)。同样,您应该使用标头中定义的用于SSID和BSSID字典值的常量。这里绝对不需要Unsafe类型,所有数据类型都是定义良好的。就是说,此代码的CaptiveNetwork版本已在iOS 14中弃用,建议您改用NetworkExtension
框架。
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
}
就用户权限而言,您有可能,但您需要在文档中为CNCopyCurrentNetworkInfo或fetchCurrent定义的四个之一-在大多数情况下,我认为您需要添加CoreLocation并请求权限使用用户的位置。例如,Info.p列表中的Privacy - Location When In Use Usage Description
需要您要求用户位置的原因,然后必须进行呼叫以请求用户授权对话框。
import CoreLocation
CLLocationManager().requestWhenInUseAuthorization()
您的应用还需要权利-com.apple.developer.networking.wifi-info
,该权利已添加到项目的“ 签名和功能”部分中,称为“ 访问WiFi信息”。使用NEHotspotNetwork
方法时,还需要附加的网络扩展权利。