2017-02-22 66 views
1

有沒有辦法在MacOS上使用Swift 3.0獲得首選(=保存的)wifi的ssid列表?使用Swift 3獲取Mac上的首選wifi網絡列表

我發現了一些不推薦使用的例子,並且(令人驚訝的是)只能在iOS上運行。

Network Preferences

+0

我的回答[這裏](http://stackoverflow.com/a/35806639/2227743)應該幫助你 - 我想你可以通過解析結果找到列表中的首選/保存的。 – Moritz

+0

糾正我,如果我錯了,但你的解決方案似乎提供當前可用的網絡。我想獲得計算機在其生命週期中連接的那些。 – l3aronsansgland

+0

你說得對。我認爲這份名單會包括他們,但顯然不是。 – Moritz

回答

1

首選網絡被存儲在作爲plist中系統偏好NSUserDefaults的一部分。雖然我沒有看到一個API來直接訪問這些名字,你可以使用defaults shell命令或NSTask訪問值:

defaults read /Library/Preferences/SystemConfiguration/com.apple.airport.preferences | grep SSIDString 

注意,在這份名單僅僅是不是所有的的SSID的計算機已連接到,但列表與任何啓用iCloud的設備同步。

相關討論在這裏:OS X Daily - See a List of All Wi-Fi Networks a Mac Has Previously Connected To

0

它可能不是最漂亮的代碼以往,但在雨燕3.0的作品。

func shell(arguments: [String] = []) -> (String? , Int32) { 
    let task = Process() 
    task.launchPath = "/bin/bash" 
    task.arguments = arguments 

    let pipe = Pipe() 
    task.standardOutput = pipe 
    task.standardError = pipe 
    task.launch() 
    let data = pipe.fileHandleForReading.readDataToEndOfFile() 
    let output = String(data: data, encoding: .utf8) 
    let terminationStatus = task.terminationStatus 
    return (output, terminationStatus) 
} 

擴展:

extension String { 
    func stringByReplacingFirstOccurrenceOfString(
     target: String, withString replaceString: String) -> String 
    { 
     if let range = self.range(of: target) { 
      return self.replacingCharacters(in: range, with: replaceString) 
     } 
     return self 
    } 
} 

extension String { 
    func stringByReplacingLastOccurrenceOfString(
     target: String, withString replaceString: String) -> String 
    { 
     if let range = self.range(of: target, options: String.CompareOptions.backwards) { 
      return self.replacingCharacters(in: range, with: replaceString) 
     } 
     return self 
    } 
} 

獲取和清潔的WiFi的SSID的

let (output, terminationStatus) = shell(arguments: ["-c", "defaults read /Library/Preferences/SystemConfiguration/com.apple.airport.preferences | grep SSIDString"]) 
    if (terminationStatus == 0) { 
     let arrayOfWifi = output?.components(separatedBy: CharacterSet.newlines) 

     for var aWifi in arrayOfWifi! { 
      aWifi = aWifi.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) 
      if (aWifi.hasPrefix("SSIDString = ")) { 
       aWifi = aWifi.stringByReplacingFirstOccurrenceOfString(target: "SSIDString = ", withString: "") 
      } 
      if (aWifi.hasPrefix("\"")) { 
       aWifi = aWifi.stringByReplacingFirstOccurrenceOfString(target: "\"", withString: "") 
      } 
      if (aWifi.hasSuffix("\";")) { 
       aWifi = aWifi.stringByReplacingLastOccurrenceOfString(target: "\";", withString: "") 
      } 
      if (aWifi.hasSuffix(";")) { 
       aWifi = aWifi.stringByReplacingLastOccurrenceOfString(target: ";", withString: "") 
      } 
      aWifi = aWifi.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) 
      print(aWifi) 
     } 
    } 
}