iOS 11.0 - 定期扫描附近的SSID(WiFi)

时间:2017-06-09 06:58:27

标签: ios iphone ssid ios11 nehotspothelper

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

我已经对iOS 10中的Hotspot Helper框架做了快速研究。我发现,这些API并非设计用于我已经确定的用途。

似乎,iOS 11现在允许应用程序以编程方式管理Wi-Fi配置。 Apple为热点配置方法和属性添加了网络扩展。请click here查看更改。

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

对此的任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:11)

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

当我了解NEHotspotConfiguration时,我最初很兴奋,因为我希望我们可以自动完成这个过程。但是,它似乎没有办法检索当前可用的SSID列表,这使NEHotspotConfiguration对我们的用例的用处更少。

答案 1 :(得分:1)

不可能。

我启用了NEHotspotHelper权限并尝试了演示应用程序。即使Apple允许您配置wifi连接,也要获取可用网络列表,仍需要打开“设置”>“ wifi”页面以获取列表。该API可以提供在后台扫描WiFi列表的功能,更不用说定期进行扫描了。

这对开发人员来说是可惜的,但是我认为,通过严格限制API的使用来保护隐私和安全对iOS用户来说是一件好事。

答案 2 :(得分: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的列表以及其信号强度。