NEHotspotHelper.register 未收到回调 iOS11

nir*_*i21 3 swift nehotspothelper 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Sen*_*ful 7

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

同样在您提供的屏幕截图中,您为Hotspot Configuration启用了权利,但您调用的 API 是用于Hotspot Helper 的。这两个功能需要非常不同的权利。您需要确保为 Hotspot Helper 调用该 API 配置了所有内容。再次,请参阅下文以了解详细信息。有关这些类似命名的 API 的差异的更多详细信息,请参阅Hotspot Helper 与 Hotspot Configuration


使用 NEHotspotHelper:

  1. 申请网络扩展权限。

    这需要在Apple 的网站上完成。

  2. 修改您的配置文件。

    转到http://developer.apple.comEdit在您的个人资料附近点击。在底部显示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().

Swift 示例

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)
Run Code Online (Sandbox Code Playgroud)

资料来源: