如何使用Swift在iOS中获取可用的WiFi网络名称

22

我想获取一个区域内所有可用WiFi网络及其SSID值。但问题在于如何获取所有可用的WiFi网络的SSID,即使我没有连接到其中任意一个。


@EnricoSusatyo 我有同样的问题,我不能获取所有可用的WiFi列表。 - Jatin Devani
不容易。扫描WiFi网络是一种安全威胁。 - Sulthan
4
我在谷歌上快速搜索到了类似的问题,常见的答案是虽然你可以这样做,但由于苹果的规定,你不应该这样做。 - RubberDucky4444
是的,我在这里找到了一个类似的问题:https://dev59.com/fG435IYBdhLWcg3w0ThP - ramacode
3个回答

16

iOS 12

请在Xcode中为您的应用启用Access WiFi Information功能,以便在iOS 12及更高版本中使用此功能。启用此功能后,Xcode将自动向您的entitlements文件和App ID添加Access WiFi Information权限。 文档链接

首先:

导入SystemConfiguration.CaptiveNetwork

然后:

 func getInterfaces() -> Bool {
    guard let unwrappedCFArrayInterfaces = CNCopySupportedInterfaces() else {
        print("this must be a simulator, no interfaces found")
        return false
    }
    guard let swiftInterfaces = (unwrappedCFArrayInterfaces as NSArray) as? [String] else {
        print("System error: did not come back as array of Strings")
        return false
    }
    for interface in swiftInterfaces {
        print("Looking up SSID info for \(interface)") // en0
        guard let unwrappedCFDictionaryForInterface = CNCopyCurrentNetworkInfo(interface) else {
            print("System error: \(interface) has no information")
            return false
        }
        guard let SSIDDict = (unwrappedCFDictionaryForInterface as NSDictionary) as? [String: AnyObject] else {
            print("System error: interface information is not a string-keyed dictionary")
            return false
        }
        for d in SSIDDict.keys {
            print("\(d): \(SSIDDict[d]!)")
        }
    }
    return true
}

12
在iPhone 7上的iOS 11.2.2系统中,这似乎只返回当前连接的Wifi。 - TestinginProd

0
这是我的一个类,用于打印WIFI网络名称。
import UIKit
import Foundation
import SystemConfiguration.CaptiveNetwork

class FirstView: UIViewController
{
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad()
    {
        super.viewDidLoad()
        let ssid = self.getWiFiName()
        print("SSID: \(ssid)")
    }

    func getWiFiName() -> 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
    }
}

8
这似乎只显示了已连接接口的SSID。 - picciano
var ssid = ""; (CNCopySupportedInterfaces() as? [CFString])?.forEach({ ssid = (CNCopyCurrentNetworkInfo($0) as? [String : Any])?[kCNNetworkInfoKeySSID as String] as? String ?? ""}) - Leo Dabus

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接