一、简介
参考苹果官方文档:https://developer.apple.com/reference/networkextension/nehotspothelper
NEHotspotHelper 是 NetworkExtension.framework中与wifi连接相关的一个功能类。
1.+ supportedNetworkInterfaces
可以获取到当前扫描到的WIFI列表,包含SSID,加密方式,信号强度信息。
2.+ registerWithOptions:queue:handler:
注册当前app成为一个wifi辅助管理者,可以对指定的wifi,进行密码导入,并作字符串标记。
二、使用步骤
第一部分(权限申请)
1.向苹果官方邮箱发权限申请邮件,使用自己的开发者账号邮箱申请,即代表所在的开发团队申请
2.邮件内容需要简单介绍APP的使用场景,以及为什么要使用NEHotspotHelper。
英文水平渣,大概看看就好。
3.发送完,就会收到一封苹果的回复,这时候去访问提示的那个网址,填写对应的权限申请信息。
4.访问https://developer.apple.com/contact/network-extension/,登入自己开发账号,会有自己和所在开发团队的信息
5.填写对应的App信息,然后send。
6.邮箱会收到信息确认邮件,核实一下刚才填写的信息。如果没问题,就等大约三周时间,等苹果官方回复。
7.我这次 6月15申请,7月1号收到申请通过的邮件
8.去开发者中心配置开发证书,把Wireless Accessory Configuration,iCloud配置进去。
注意:配置文件,必须新建,在之前已存在的修改,后面工程运行会提示证书权限不匹配。
第二部分(项目工程配置)
1.Target - Capabilities 开启iCloud 和 Wireless Accessory Configuration
2.上述步骤完成,工程会自动生成一个 .entitlements 权限文件,需要手动添加一项:com.apple.developer.networking.HotspotHelper ,设置它的Bool值为YES
3.在项目中配置info.plist文件
UIBackgroundModels 数组中增加 network-authentication
4.使用NEHotspotHelper
程序后台运行,进入系统WIFI设置页时,就会走NEHotspotHelperHandler回调,对代码中设置的网络,会进行密码填充和标记。
接下来我们创建一个示例工程,演示如何获取 WiFi 列表。首先,将 Bundle ID 改为之前设置的 EFNEHotspotHelperDemo:
修改 Bundle ID
然后在 Info.plist 中添加后台模式权限数组:
添加后台模式代码
代码如下:
UIBackgroundModesnetwork-authentication
添加完成后可以在 Target -> Capabilities 中看到后台模式已处于开启状态:
后台模式已开启
接下来在 Capabilities 找到 Wireless Accessory Configuration 并将其打开:
打开 Wireless Accessory Configuration
在工程中找到后缀为 {工程名}.entitlements 的文件 EFNEHotspotHelperDemo.entitlements,在其中加入 HotspotHelper 权限代码:
添加 HotspotHelper 权限代码
代码如下:
com.apple.developer.networking.HotspotHelper
好了,到这里已经完成了各种乱七八糟的配置工作,可以尝试进行 Build。如果没有提示错误信息的话,接下来就可以愉快地使用 HotspotHelper 了;如果有问题的话,请检查之前的步骤是否都已正确完成或者根据错误信息修改具体项目。
核心代码部分,首先在需要使用 HotspotHelper 的地方添加头文件引用,这里以 Objective-C 代码为例:
#import
然后使用如下代码即可将 WiFi 列表信息打印到 XCode 控制台,注意:这里需要打开系统设置中的无线局域网页面才能获取相关信息,因为打开该页面系统刷新 WiFi 信息时才会触发该回调:
- (void)scanWifiInfos{NSLog(@"1.Start");NSMutableDictionary* options = [[NSMutableDictionaryalloc] init]; [options setObject:@"EFNEHotspotHelperDemo"forKey: kNEHotspotHelperOptionDisplayName];dispatch_queue_tqueue = dispatch_queue_create("EFNEHotspotHelperDemo",NULL);NSLog(@"2.Try");BOOLreturnType = [NEHotspotHelper registerWithOptions: options queue: queue handler: ^(NEHotspotHelperCommand * cmd) {NSLog(@"4.Finish"); NEHotspotNetwork* network;if(cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {// 遍历 WiFi 列表,打印基本信息for(networkincmd.networkList) {NSString* wifiInfoString = [[NSStringalloc] initWithFormat:@"---------------------------\nSSID: %@\nMac地址: %@\n信号强度: %f\nCommandType:%ld\n---------------------------\n\n", network.SSID, network.BSSID, network.signalStrength, (long)cmd.commandType];NSLog(@"%@", wifiInfoString);// 检测到指定 WiFi 可设定密码直接连接if([network.SSID isEqualToString:@"测试 WiFi"]) { [network setConfidence: kNEHotspotHelperConfidenceHigh]; [network setPassword:@"123456789"]; NEHotspotHelperResponse *response = [cmd createResponse: kNEHotspotHelperResultSuccess];NSLog(@"Response CMD: %@", response); [response setNetworkList: @[network]]; [response setNetwork: network]; [response deliver]; } } } }];// 注册成功 returnType 会返回一个 Yes 值,否则 NoNSLog(@"3.Result: %@", returnType ==YES?@"Yes":@"No");}