3

我正在研究 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
        }
    }

如果我遗漏任何步骤,请告诉我。

4

1 回答 1

7

您应该检查register()函数的结果。如果它正在返回false,则可能未正确配置某些内容。请参阅下面的配置说明的完整列表。

同样在您提供的屏幕截图中,您为Hotspot Configuration启用了权利,但您调用的 API 是针对Hotspot Helper的。这两个功能需要非常不同的权利。您需要确保为 Hotspot Helper 配置了所有内容以调用该 API。同样,请参阅下面的完整详细信息。有关这些名称相似的 API 的差异的更多详细信息,请参阅Hotspot Helper vs. Hotspot Configuration


要使用 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()函数。

    此方法应在应用程序启动时调用一次。再次调用它不会有任何效果并导致 false 被返回。

    您应该确保函数返回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)

资料来源:

于 2018-09-24T04:38:20.637 回答