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

11

我希望能定期扫描附近的 Wi-Fi 热点(无需连接),并应用一个或多个 SSID 过滤器。一旦匹配成功,将启动后端 API 调用。

我对 iOS 10 中的热点助手框架进行了快速调研。我发现,这些 API 并未设计用于我所确定的用途。

似乎 iOS 11 现在允许应用以编程方式管理 Wi-Fi 配置。Apple 添加了一个网络扩展,用于热点配置方法和属性。请 单击此处 查看更改。

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

非常感谢任何关于此的帮助。

3个回答

12

很遗憾,在iOS中我们无法实现这一点。

当我了解到NEHotspotConfiguration时,一开始我很兴奋,因为我希望我们可以自动化这个过程。然而,看起来没有办法检索当前可用的SSID列表,这使得NEHotspotConfiguration在我们的使用场景下不太有用。


我想在我的iPhone上扫描附近的WiFi网络,并获取它们的接收信号值(RSS)。我不想连接我的设备到WiFi网络。使用NEHotspotConfiguration是否可能?是否有Objective-C的示例代码片段可用? - santobedi
这个帖子说这是可能的。我有点困惑。我刚开始挖掘WiFi信号强度。以前我用蓝牙信号强度工作,我可以高效地工作。 - santobedi
4
不行,你不能这样做。你提供的解决方案只适用于iOS 9 GM版本,不适用于其他版本。我已经做了充分的研究。 - Shamsudheen TK
所以我们没有办法获取WiFi网络列表吗? - shaqir saiyed

3

不可能。

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

这对开发人员来说很遗憾,但我认为严格限制API使用以保护隐私和安全对iOS用户是有好处的。


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


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