有沒有辦法在MacOS上使用Swift 3.0獲得首選(=保存的)wifi的ssid列表?使用Swift 3獲取Mac上的首選wifi網絡列表
我發現了一些不推薦使用的例子,並且(令人驚訝的是)只能在iOS上運行。
有沒有辦法在MacOS上使用Swift 3.0獲得首選(=保存的)wifi的ssid列表?使用Swift 3獲取Mac上的首選wifi網絡列表
我發現了一些不推薦使用的例子,並且(令人驚訝的是)只能在iOS上運行。
首選網絡被存儲在作爲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
它可能不是最漂亮的代碼以往,但在雨燕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)
}
}
}
我的回答[這裏](http://stackoverflow.com/a/35806639/2227743)應該幫助你 - 我想你可以通過解析結果找到列表中的首選/保存的。 – Moritz
糾正我,如果我錯了,但你的解決方案似乎提供當前可用的網絡。我想獲得計算機在其生命週期中連接的那些。 – l3aronsansgland
你說得對。我認爲這份名單會包括他們,但顯然不是。 – Moritz