iOS 11.0 - Периодически сканируйте SSID (WiFi) поблизости
Я хотел бы периодически сканировать близлежащие идентификаторы SSID сетей Wi-Fi (без подключения к нему) и применять фильтр SSID (один или несколько). Как только найдено совпадение, инициируется внутренний вызов API.
Я провел быстрое исследование фреймворка Hotspot Helper в iOS 10. Я обнаружил, что эти API не предназначены для использования, которое я определил.
Похоже, iOS 11 теперь позволяет приложениям программно управлять конфигурациями Wi-Fi. Apple добавила сетевое расширение для методов и свойств конфигурации точки доступа. Пожалуйста, нажмите здесь, чтобы увидеть изменения.
Мой вопрос здесь, могу ли я достичь своей цели с помощью нового класса конфигурации точки доступа iOS 11? Или это обеспечивает SSID известной сети или подключенной в настоящее время?
Любая помощь по этому вопросу высоко ценится.
1 ответ
К сожалению, мы не можем добиться этого в iOS.
Когда я узнал о NEHotspotConfiguration, я был изначально взволнован, потому что надеялся, что мы сможем автоматизировать этот процесс. Однако не похоже, что есть способ получить список доступных в настоящее время SSID, что делает NEHotspotConfiguration гораздо менее полезной для нашего варианта использования.
Невозможно.
У нас есть NEHotspotHelper
разрешение и попробовал на нашем демо-приложении. Даже Apple дает вам разрешение, чтобы каждый раз получать список Wi-Fi в вашем приложении, вам нужно открыть страницу Настройки - WiFi, чтобы получить список WiFi поблизости. Этот API не может предлагать возможность сканировать список Wi-Fi поблизости в фоновом режиме, не говоря уже о периодическом.
Жаль разработчиков, но я думаю, что для пользователей iOS полезно защищать конфиденциальность и безопасность путем строгого ограничения использования API.
Насколько я понимаю, вы можете достичь этого с помощью следующего кода
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
}
}
Единственная проблема заключается в том, что вы должны быть на странице настроек Wi-Fi, чтобы получить список всех доступных SSID вместе с их уровнем сигнала.