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

问题描述 投票:10回答:3

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

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

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

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

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

ios iphone ssid ios11 nehotspothelper
3个回答
11
投票

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

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


1
投票

不可能。

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

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


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的列表以及它们的信号强度。

© www.soinside.com 2019 - 2024. All rights reserved.