使用Swift 3获取Mac上首选的wifi网络列表

时间:2017-02-22 13:58:54

标签: swift macos

有没有办法在MacOS上使用Swift 3.0获取首选(=已保存)的wifi ssid列表?

我发现了一些不赞成的例子,并且(令人惊讶的是)只能在iOS上运行。

Network Preferences

2 个答案:

答案 0 :(得分:1)

首选网络作为系统偏好设置NSUserDefaults的一部分存储在plist中。虽然我没有看到直接访问这些名称的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

答案 1 :(得分:0)

它可能不是有史以来最漂亮的代码,但它适用于Swift 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)
        }
    }
}