NEHotspotHelper.register 未收到回调iOS11

Posted

技术标签:

【中文标题】NEHotspotHelper.register 未收到回调iOS11【英文标题】:NEHotspotHelper.register not received call back iOS11 【发布时间】:2017-10-16 09:35:34 【问题描述】:

我正在使用 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 Configuration 启用了权利,但您调用的 API 是针对 Hotspot Helper。这两个功能需要非常不同的权利。您需要确保为 Hotspot Helper 配置了所有内容以调用该 API。同样,请参阅下面的完整详细信息。请参阅Hotspot Helper vs. Hotspot Configuration,了解有关这些名称相似的 API 之间差异的更多详细信息。


使用 NEHotspotHelper:

    申请网络扩展授权。

    这需要在Apple's website here 完成。

    修改您的配置文件。

    转到http://developer.apple.com。在您的个人资料附近点击Edit。在底部显示Entitlements 的位置,选择包含网络扩展权利的那个。

    更新您应用的权利文件。

    应用程序必须将com.apple.developer.networking.HotspotHelper 设置为其权利之一。权利的值是一个设置为 true 的布尔值。

    添加背景模式

    应用程序的Info.plist 必须包含一个UIBackgroundModes 数组,其中包含network-authentication

    请注意,与转换为人类可读字符串的所有其他背景模式不同,此模式将保持为network-authentication

    调用NEHotspotHelper.register()函数。

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

    您应该确保函数返回true。否则上述步骤之一可能没有正确配置。

    了解何时调用此回调。

    从文档来看,何时调用此回调并不完全清楚。例如,可以假设 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)

来源:

https://developer.apple.com/documentation/networkextension/nehotspothelper/1618965-register https://medium.com/@prvaghela/nehotspothelper-register-an-app-as-a-hotspot-helper-cf92a6ed7b72 https://***.com/a/39189063/35690

【讨论】:

申请网络扩展授权时。我们必须回答两个问题,即 - 您的应用支持哪种 IP 协议?您的应用支持哪种传输协议? - 我如何在我的项目中找到这个问题的答案? @Senseful 有什么想法吗?

以上是关于NEHotspotHelper.register 未收到回调iOS11的主要内容,如果未能解决你的问题,请参考以下文章