2016-03-04 48 views
1

我试图显示所有可用的WIFI连接。它不起作用。这里是我的代码:在OS X中显示与Swift的所有可用WIFI连接

import Foundation 
import CoreWLAN 

var cwInterface = CWInterface() 

do { 
    let routers = try cwInterface.scanForNetworksWithSSID(nil) 
    print(routers) 
} catch let error as NSError { 
    print("Error: \(error.localizedDescription)") 
} 

我没有得到任何结果。我做错了什么?

回答

2

它适用于初始化接口名称的CWInterface,如“en1”。

但是最好不要使用harcoded名称,所以我们还会使用CWWiFiClient.sharedWiFiClient().interface(),它会返回默认的WIFI接口。一类

实例来管理这一切:

class Discovery { 

    var currentInterface: CWInterface 
    var interfacesNames: [String] = [] 
    var networks: Set<CWNetwork> = [] 

    // Failable init using default interface 
    init?() { 
     if let defaultInterface = CWWiFiClient.sharedWiFiClient().interface(), 
       name = defaultInterface.interfaceName { 
      self.currentInterface = defaultInterface 
      self.interfacesNames.append(name) 
      self.findNetworks() 
     } else { 
      return nil 
     } 
    } 

    // Init with the literal interface name, like "en1" 
    init(interfaceWithName name: String) { 
     self.currentInterface = CWInterface(interfaceName: name) 
     self.interfacesNames.append(name) 
     self.findNetworks() 
    } 

    // Fetch detectable WIFI networks 
    func findNetworks() { 
     do { 
      self.networks = try currentInterface.scanForNetworksWithSSID(nil) 
     } catch let error as NSError { 
      print("Error: \(error.localizedDescription)") 
     } 
    } 

} 

用默认接口调用它:

if let discovery = Discovery() { 
    print(discovery.networks) 
    for network in discovery.networks { 
     print(network.ssid!) 
    } 
} 

或与接口名称:

let discovery = Discovery(interfaceWithName: "en1") 
let results = discovery.networks 

结果包含了所有扫描的网络:

[<CWNetwork: 0x608000001bd0> [ssid=SomeNetworkName, bssid=xxxx, security=WPA Enterprise, rssi=xx, channel=<CWChannel: 0x600000004fb0> [channelNumber=11(2GHz), channelWidth={20MHz}], ibss=0], etc]

+1

使用让名= CWWiFiClient.interfaceNames()或(不建议使用,现在让names_old = CWInterface.interfaceNames()),它给你设定可用的接口名称(我同意, “EN1” 将最有可能是该集合中的唯一值,但我尽量避免使用“有线”名称) – user3441734

+1

我使用let interface = CWWiFiClient.sharedWiFiClient()。interface()这给了我'默认'有界面(是的,通常是相同的作为CWInterface(名称:“en1”))。 – user3441734

+0

@ user3441734再次,一个非常有用的评论。我已经将这添加到我的默认初始化程序的答案中。谢谢你的提示。 – Moritz