在Swift 2中获取SSID

Osw*_*uez 14 iphone ssid ios swift

我试图使用此代码获取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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在这一行中出现错误 let interfacesArray = interfaces.takeRetainedValue() as [String : AnyObject]

错误是

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

谢谢你的帮助

Rik*_*cma 25

这可能对你有所帮助(在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
    }
}
Run Code Online (Sandbox Code Playgroud)

我接受并调整了Ray Wenderlich网站的代码(曾经在这里: 在iOS9中检索SSID,但现在特定线程已从网站中删除)

iOS 12

您必须从功能启用Access WiFi信息.

重要信息要在iOS 12及更高版本中使用此功能,请在Xcode中为您的应用启用Access WiFi信息功能.启用此功能后,Xcode会自动将Access WiFi信息权利添加到您的权利文件和应用程序ID中.文档链接

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,CaptiveNetwork在iOS 9.0中已弃用.所以我建议使用替代解决方案. (3认同)
  • 不再在iOS 10中弃用http://stackoverflow.com/a/33132529/2865234 @MattLeFleur (2认同)

Rob*_*Rob 14

这是我的解决方案 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
    }

}
Run Code Online (Sandbox Code Playgroud)

要使用它:

let wifiName = network().getSSID()

    guard wifiName != nil else {

        //// TODO: Alert -----
        print("no wifi name")

        return
    }


    print("my network name is: \(wifiName!)")
Run Code Online (Sandbox Code Playgroud)

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


wer*_*ver 8

目前提出的所有解决方案看起来相当复杂,丑陋的不安全演员.

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

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
}
Run Code Online (Sandbox Code Playgroud)


Jap*_*pes 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
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

SSID.fetchSSIDInfo()

//will return "" if no connected wifi or running in simulator 
Run Code Online (Sandbox Code Playgroud)


Wei*_*iao 1

在 swift 2 中,您不必调用takeRetainedValue.

\n\n

将代码替换interfaces.takeRetainedValue() as [String : AnyObject]Array(arrayLiteral: interfaces).

\n\n

还记得将代码更改interfacesArray[0] as StringString(interfacesArray[0]).

\n\n

完整代码 \xef\xbc\x9a

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

}

\n