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的主要内容,如果未能解决你的问题,请参考以下文章