11

我想定期扫描附近的 Wi-Fi 网络的 SSID(不连接到它)并实施一个 SSID 过滤器(一个或多个)。一旦找到匹配项,就会启动后端 API 调用。


我对 iOS 10 中的 Hotspot Helper 框架进行了快速研究。我发现,这些 API 并不是为我确定的用途而设计的。


看起来,iOS 11 现在允许应用程序以编程方式管理 Wi-Fi 配置。Apple 为热点配置方法和属性添加了网络扩展。请点击此处查看更改。</p>

我的问题是,我可以通过iOS 11 新的热点配置类来实现我的目标吗?或者这是否提供已知网络或当前连接的网络的 SSID?</p>


对此的任何帮助都将受到高度赞赏。

4

3 回答 3

12

不幸的是,我们无法在 iOS 中实现这一点。

当我了解NEHotspotConfiguration时,我最初很兴奋,因为我希望我们可以自动化这个过程。但是,似乎没有一种方法可以检索当前可用的 SSID 列表,这使得NEHotspotConfiguration对我们的用例不太有用。

于 2017-10-19T20:04:17.747 回答
2

不可能。

我启用了NEHotspotHelper权限并尝试了演示应用程序。尽管 Apple 确实允许您配置 wifi 连接,但为了获取可用网络列表,您需要打开“设置”>“WiFi”页面以获取列表。此 API 无法提供后台扫描 WiFi 列表的功能,更不用说定期扫描。

这对开发者来说是一个遗憾,但我认为这对 iOS 用户是有好处的,通过严格限制 API 的使用来保护隐私和安全。

于 2019-02-21T06:54:57.953 回答
0

根据我的理解,您可以使用以下代码实现此目的

      let targetSsid = getCurrentSSID()
    let targetAnnotation: String = targetSsid!

    //let options: [String: NSObject] = [kNEHotspotHelperOptionDisplayName : targetAnnotation as NSObject]
    //let queue: DispatchQueue = DispatchQueue(label: "com.myapp.appname", attributes: DispatchQueue.Attributes.concurrent)

    NSLog("Started wifi list scanning.")


    let options: [String: NSObject] = [
        kNEHotspotHelperOptionDisplayName: targetAnnotation as NSString
    ]

    let queue = DispatchQueue(label: "com.example.test")

    let isAvailable = NEHotspotHelper.register(options: options, queue: queue) { (command) in
        switch command.commandType {
        case .evaluate,
             .filterScanList:
            let originalNetworklist = command.networkList ?? []
            let networkList = originalNetworklist.compactMap { network -> NEHotspotNetwork? in
                print("networkName: \(network.ssid); strength: \(network.signalStrength)")
                if network.ssid == targetSsid {
                    network.setConfidence(.high)
                    //network.setPassword(targetPassword)
                    return network
                }
                return nil
            }
            let response = command.createResponse(.success)
            response.setNetworkList(networkList)
            response.deliver()
        default:
            break
        }
    }

唯一的问题是您必须在 wifi 设置页面获取所有可用 SSID 的列表及其信号强度。

于 2019-02-04T15:55:02.973 回答