I would like to scan for nearby SSIDs of the Wi-Fi networks periodically (without connecting to it) and implement an SSID filter (one or multiple). Once a match is found a back-end API call is initiated.
I have done a quick research on the Hotspot Helper framework in iOS 10. I found that, these APIs are not designed for the use I’ve identified.
Seems like, iOS 11 now allows apps to manage Wi-Fi configurations programmatically. Apple added a network extension for hotspot configuration methods and properties. Please click here to see the changes.
My question here is, can I achieve my goal through the newly iOS 11 hotspot configuration class? Or does this provide the SSID of a known network or the currently connected one?
Any help on this is highly appreciated.
Unfortunately, we can't achieve this in iOS.
When I learned about 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 much less useful for our use case.
Not possible.
I enabled the NEHotspotHelper
permission and tried on a Demo app. Even though Apple does allow you to configure wifi connections, in order to get the list of available networks, you need to open the Settings > WiFi page to get the list. This API can NOT offer the ability to scan the WiFi list in background, not to mention periodically.
It's a pity for developers, but I think it's good for iOS users, to protect privacy and safety by strict restriction of the API usage.
As per my understanding you can achieve this using following code
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
}
}
Only problem is that you have to be at wifi settings page to get the list of all available SSIDs along with their signal strength.
来源:https://stackoverflow.com/questions/44451287/ios-11-0-periodically-scan-for-ssids-wifi-nearby