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 вместе с их уровнем сигнала.

Другие вопросы по тегам