<NetworkExtension/NetworkExtension.h>,这个框架在iOS9之前是不开放的,而之后,在这里我惊奇的发现了这个
想想几年前为了使用这个东西是要想苹果大爷申请的。苹果大爷从不放低姿态,申请也是一波三折。NetworkExtension不仅涉及了WiFi这项功能,还包含了VPN在内,当然国内搞VPN是不太健康的行为。
然而很坑爹的是,我再次去使用这个框架去获取WiFi的时候,用到了NEHotspotHelper,这时候发现苹果大爷仍然要求使用NEHotspotHelper还得向他提出申请https://developer.apple.com/contact/request/network-extension/
我们跳过申请,看看框架的使用。
引入框架<NetworkExtension/NetworkExtension.h>
#import <NetworkExtension/NetworkExtension.h>
使用NEHotspotHelper注册
//returnType=yes注册成功,否则反之
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler:^(NEHotspotHelperCommand * _Nonnull cmd) {
}];
但是在注册前,我们其实还需要添加一些设置。我们进入registerWithOptions方法,查看说明可以看到
没错,我们要开启一个后台模式,而且还得添加network-authentication
之后再到Info.plist ----open As----source code文件找到UIBackgroundModes
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>network-authentication</string>
</array>
然后再回到代码中来。
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"🗝" forKey:kNEHotspotHelperOptionDisplayName];//在wifi列表上显示的标记,如万能钥匙显示在wifi列表上的🔑一样。
dispatch_queue_t queue = dispatch_queue_create("myWiFi", DISPATCH_QUEUE_CONCURRENT);
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler:^(NEHotspotHelperCommand * _Nonnull cmd) {
if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {
NSLog(@"%@",cmd.networkList);
}
}];
如果申请NEHotspotHelper使用权通过了,那么这里注册就会成功,至于commandType,可以自己到枚举里面了解。在这里你是注册成功了,但你还是无法获取wifi列表,因为你还需要前往手机系统wifi列表,每当系统wifi列表刷新的时候,都会调用这里的代码块。
获取当前wifi信息
注册成功后,使用这个方法,可以获取当前连接的wifi信息
NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
NEHotspotNetwork *connectedNetwork = [array lastObject];
不管是当前wifi还是获取当wifi列表,你都可以获取到wifi信息。其中包括了最重要的SSID,BSSID。
填充密码
在代码块里,遍历wifi列表,找到你要要填充的wifi,比如像下面的。
for (NEHotspotNetwork* network in cmd.networkList) {
if(network.secure == YES&&[network.BSSID containsString:@"09:08:07:06"]){
[network setConfidence:kNEHotspotHelperConfidenceHigh];
[network setPassword:@"12345678"];
}
}
NEHotspotHelperResponse * response = [cmd createResponse:kNEHotspotHelperResultSuccess];
// [response setNetworkList:@[network]];//填充多个wifi密码
[response setNetwork:network];
[response deliver];
这里跑过后,再去系统的wifi列表中,点击带有🗝的wifi点击,就会自动连接无需手动填入密码。
重新连接新wifi,会有一个刷新,这时候你可以判断是否连接OK
//=2连接成
if (cmd.commandType == 2) {...}