<NetworkExtension/NetworkExtension.h>,這個(gè)框架在iOS9之前是不開(kāi)放的,而之后,在這里我驚奇的發(fā)現(xiàn)了這個(gè)

想想幾年前為了使用這個(gè)東西是要想蘋(píng)果大爺申請(qǐng)的。蘋(píng)果大爺從不放低姿態(tài),申請(qǐng)也是一波三折。NetworkExtension不僅涉及了WiFi這項(xiàng)功能,還包含了VPN在內(nèi),當(dāng)然國(guó)內(nèi)搞VPN是不太健康的行為。
然而很坑爹的是,我再次去使用這個(gè)框架去獲取WiFi的時(shí)候,用到了NEHotspotHelper,這時(shí)候發(fā)現(xiàn)蘋(píng)果大爺仍然要求使用NEHotspotHelper還得向他提出申請(qǐng)https://developer.apple.com/contact/request/network-extension/
我們跳過(guò)申請(qǐng),看看框架的使用。
引入框架<NetworkExtension/NetworkExtension.h>
#import <NetworkExtension/NetworkExtension.h>
使用NEHotspotHelper注冊(cè)
//returnType=yes注冊(cè)成功,否則反之
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler:^(NEHotspotHelperCommand * _Nonnull cmd) {
}];
但是在注冊(cè)前,我們其實(shí)還需要添加一些設(shè)置。我們進(jìn)入registerWithOptions方法,查看說(shuō)明可以看到

沒(méi)錯(cuò),我們要開(kāi)啟一個(gè)后臺(tái)模式,而且還得添加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>
然后再回到代碼中來(lái)。
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"??" forKey:kNEHotspotHelperOptionDisplayName];//在wifi列表上顯示的標(biāo)記,如萬(wàn)能鑰匙顯示在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);
}
}];
如果申請(qǐng)NEHotspotHelper使用權(quán)通過(guò)了,那么這里注冊(cè)就會(huì)成功,至于commandType,可以自己到枚舉里面了解。在這里你是注冊(cè)成功了,但你還是無(wú)法獲取wifi列表,因?yàn)槟氵€需要前往手機(jī)系統(tǒng)wifi列表,每當(dāng)系統(tǒng)wifi列表刷新的時(shí)候,都會(huì)調(diào)用這里的代碼塊。
獲取當(dāng)前wifi信息
注冊(cè)成功后,使用這個(gè)方法,可以獲取當(dāng)前連接的wifi信息
NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
NEHotspotNetwork *connectedNetwork = [array lastObject];
不管是當(dāng)前wifi還是獲取當(dāng)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]];//填充多個(gè)wifi密碼
[response setNetwork:network];
[response deliver];
這里跑過(guò)后,再去系統(tǒng)的wifi列表中,點(diǎn)擊帶有??的wifi點(diǎn)擊,就會(huì)自動(dòng)連接無(wú)需手動(dòng)填入密碼。
重新連接新wifi,會(huì)有一個(gè)刷新,這時(shí)候你可以判斷是否連接OK
//=2連接成
if (cmd.commandType == 2) {...}