我想定期扫描附近的Wi-Fi网络SSID(不连接它)并实现SSID过滤器(一个或多个)。找到匹配后,将启动后端API调用。
我已经对iOS 10中的Hotspot Helper框架做了快速研究。我发现,这些API并非设计用于我已经确定的用途。
似乎,iOS 11现在允许应用程序以编程方式管理Wi-Fi配置。 Apple为热点配置方法和属性添加了网络扩展。请click here查看更改。
我的问题是,我可以通过新的iOS 11热点配置类实现我的目标吗?或者这是否提供已知网络的SSID或当前连接的网络?
对此的任何帮助都非常感谢。
答案 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的列表以及其信号强度。