NEHotspotHelper.register не получил обратный звонок iOS11

Я работаю над NEHotspotHelper и пытаюсь зарегистрироваться, но не получаю обратный звонок. Во-первых,

Я включил возможность: сетевые расширения

Затем добавил следующий код,

 let options: [String: NSObject] = [kNEHotspotHelperOptionDisplayName : "ABC" as NSObject]
    let queue: DispatchQueue = DispatchQueue(label: "com.ABC", attributes: DispatchQueue.Attributes.concurrent)

    NSLog("Started wifi scanning.")

    NEHotspotHelper.register(options: options, queue: queue) { (cmd: NEHotspotHelperCommand) in
        NSLog("Received command: \(cmd.commandType.rawValue)")

        if cmd.commandType == NEHotspotHelperCommandType.filterScanList {
            //Get all available hotspots
            let list: [NEHotspotNetwork] = cmd.networkList!
            //Figure out the hotspot you wish to connect to

            print(list)

        } else if cmd.commandType == NEHotspotHelperCommandType.evaluate {
            if let network = cmd.network {
                //Set high confidence for the network
                network.setConfidence(NEHotspotHelperConfidence.high)

                let response = cmd.createResponse(NEHotspotHelperResult.success)
                response.setNetwork(network)
                response.deliver() //Respond back
            }
        } else if cmd.commandType == NEHotspotHelperCommandType.authenticate {
            //Perform custom authentication and respond back with success
            // if all is OK
            let response = cmd.createResponse(NEHotspotHelperResult.success)
            response.deliver() //Respond back
        }
    }

Пожалуйста, дайте мне знать, если я пропускаю какой-либо шаг.

1 ответ

Вы должны проверить результат register() функция. Если он возвращается false, что-то, вероятно, не настроен правильно. Смотрите полный список инструкций по конфигурации ниже.

Также на предоставленном вами снимке экрана у вас включены разрешения для настройки Hotspot, но вызываемый вами API предназначен для Hotspot Helper. Две функции требуют очень разных прав. Вам нужно убедиться, что все настроено, чтобы Hotspot Helper вызывал этот API. Снова, смотрите ниже для получения полной информации. Посмотрите Hotspot Helper против Hotspot Configuration для более подробной информации о различиях этих одноименных API.


Чтобы использовать NEHotspotHelper:

  1. Подать заявку на расширение сети.

    Это нужно сделать на сайте Apple здесь.

  2. Измените свой профиль обеспечения.

    Перейти к http://developer.apple.com/. Удар Edit рядом с вашим профилем. На дне, где написано Entitlements выберите тот, который содержит право на расширение сети.

  3. Обновите файл разрешений вашего приложения.

    Приложение должно установить com.apple.developer.networking.HotspotHelper как одно из его прав. Значением права является логическое значение true.

  4. Добавить фоновый режим

    Приложения Info.plist должен включать в себя UIBackgroundModes массив, содержащий network-authentication,

    Обратите внимание, что в отличие от всех других фоновых режимов, которые преобразуются в удобочитаемые строки, этот режим останется network-authentication,

  5. Позвоните NEHotspotHelper.register() функция.

    Этот метод должен вызываться один раз при запуске приложения. Повторный вызов не будет иметь никакого эффекта и приведет к ложному возвращению.

    Вы должны убедиться, что функция возвращает true, В противном случае что-то одно из вышеуказанных шагов, вероятно, не настроено должным образом.

  6. Понять, когда будет вызван этот обратный вызов.

    Из документации не совсем понятно, когда именно будет вызываться этот обратный вызов. Например, можно предположить, что NEHotspotHelper может использоваться для мониторинга сетевых подключений. Однако обратный вызов будет (только?) Вызываться, когда пользователь перейдет в приложение "Настройки" и перейдет на страницу Wi-Fi.

    Так как ваш обратный вызов будет вызываться только в то время, когда пользователь в приложении "Настройки", вы должны подключиться к отладчику и использовать print(),

Свифт Пример

let targetSsid = "SFO WiFi"
let targetPassword = "12345678"
let targetAnnotation: String = "Acme Wireless"

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
  }
}

assert(isAvailable)

Источники:

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