iOS 11.0 - 定期扫描附近的 SSID (WiFi)
iOS 11.0 - Periodically scan for SSIDs (WiFi) nearby
我想定期扫描附近 Wi-Fi 网络的 SSID(无需连接)并实施 SSID 过滤器(一个或多个)。找到匹配项后,将启动后端 API 调用。
我对 iOS 10 中的 Hotspot Helper 框架进行了快速研究。我发现,这些 API 并不是为我确定的用途而设计的。
好像,iOS11 现在允许应用程序以编程方式管理 Wi-Fi 配置。 Apple 为热点配置方法和属性添加了网络扩展。请 click here 查看更改。
我的问题是,我可以通过新的 iOS 11 热点配置 class 实现我的目标吗?或者这是否提供已知网络或当前连接的网络的 SSID?
非常感谢对此的任何帮助。
很遗憾,我们无法在 iOS 中实现此目的。
当我了解到 NEHotspotConfiguration, I was initially excited, because I was hoping we could automate this process. However, it doesn't look like there's a way to retrieve a list of currently available SSIDs, which makes NEHotspotConfiguration 对我们的用例来说用处不大。
据我了解,您可以使用以下代码实现此目的
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 的列表及其信号强度。
不可能。
我启用了 NEHotspotHelper
权限并尝试了一个演示应用程序。尽管 Apple 确实允许您配置 wifi 连接,但为了获取可用网络列表,您需要打开“设置”>“WiFi”页面来获取列表。 API 不能 提供在后台扫描 WiFi 列表的功能,更不用说定期扫描了。
这对开发者来说是一种遗憾,但我认为这对 iOS 用户有好处,通过严格限制 API 的使用来保护隐私和安全。
我想定期扫描附近 Wi-Fi 网络的 SSID(无需连接)并实施 SSID 过滤器(一个或多个)。找到匹配项后,将启动后端 API 调用。
我对 iOS 10 中的 Hotspot Helper 框架进行了快速研究。我发现,这些 API 并不是为我确定的用途而设计的。
好像,iOS11 现在允许应用程序以编程方式管理 Wi-Fi 配置。 Apple 为热点配置方法和属性添加了网络扩展。请 click here 查看更改。
我的问题是,我可以通过新的 iOS 11 热点配置 class 实现我的目标吗?或者这是否提供已知网络或当前连接的网络的 SSID?
非常感谢对此的任何帮助。
很遗憾,我们无法在 iOS 中实现此目的。
当我了解到 NEHotspotConfiguration, I was initially excited, because I was hoping we could automate this process. However, it doesn't look like there's a way to retrieve a list of currently available SSIDs, which makes NEHotspotConfiguration 对我们的用例来说用处不大。
据我了解,您可以使用以下代码实现此目的
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 的列表及其信号强度。
不可能。
我启用了 NEHotspotHelper
权限并尝试了一个演示应用程序。尽管 Apple 确实允许您配置 wifi 连接,但为了获取可用网络列表,您需要打开“设置”>“WiFi”页面来获取列表。 API 不能 提供在后台扫描 WiFi 列表的功能,更不用说定期扫描了。
这对开发者来说是一种遗憾,但我认为这对 iOS 用户有好处,通过严格限制 API 的使用来保护隐私和安全。