iOS在應(yīng)用內(nèi)連接特定的WiFi
前言
微博上有個段子廣為流傳:海邊度假酒店老板說各國游客來了需求都不一樣: 法國人來了問這附近美女多么? 德國人來了就成天潛水斩个;意大利人來了就整天曬日光浴驯杜;中國人來了挨個問:有WiFi么受啥?WiFi密碼多少?
iOS 11 開始可以在應(yīng)用內(nèi)通過NetworkExtension中的NEHotspotConfigurationManager連接WiFi,無需到設(shè)置里手動連接滚局。
APP Extension 可以讓開發(fā)者們拓展自定義的功能和內(nèi)容到應(yīng)用程序之外居暖,并在用戶與其他應(yīng)用程序或系統(tǒng)交互時提供給用戶。蘋果定義了很多種APP Extension, 每一種不同功能的APP Extension 稱為extension point藤肢。
項目配置
創(chuàng)建工程后在Capabilities 中開啟Access WiFi Innformation, Hotspot Configuration和Network Extensoins
NEHotspotHelper
使用NEHotspotHelper 可以獲取用戶當前所有WiFi列表太闺,但此功能需要開發(fā)者申請?zhí)貏e的權(quán)限,申請通過后有兩點需要注意 :
- 在.entitlemennts文件里面新增配置:com.apple.developer.networking.HotspotHelper值為YES
- 在Info.plist中新增Required background modes, 新增item 值為network-authentication
然后可以通過以下代碼獲取用戶當前所有WiFi列表, 通過這個列表嘁圈,可以獲得每個WiFi的SSID跟束,BSSID等詳細信息。
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"Connect to MyWifi", kNEHotspotHelperOptionDisplayName, nil];
dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", 0);
BOOL isAvailable = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
NSMutableArray *hotspotList = [NSMutableArray new];
if(cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
for (NEHotspotNetwork* network in cmd.networkList) {
NSLog(@"network name:%@", network.SSID);
if ([network.SSID isEqualToString:@"TP-LINK"]) {
[network setConfidence:kNEHotspotHelperConfidenceHigh];
[network setPassword:@"<wifi-password>"];
[hotspotList addObject:network];
}
}
NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
[response setNetworkList:hotspotList];
[response deliver];
} else {
NSLog(@"there is no available wifi");
}
}];
NEHotspotConfigurationManager
iOS 11開始新增了NEHotspotConfigurationManager API丑孩,這也是Network Extension framework的一部分冀宴,支持用于以下功能:
- 可以讓用戶連接另一個智能設(shè)備的WiFi達到傳輸數(shù)據(jù)的目的,比如連接相機WiFi來拷貝相機里面的圖片
- 通過以下方式温学,可以獲取已經(jīng)添加過的連接配置所有的SSID
[[NEHotspotConfigurationManager sharedManager] getConfiguredSSIDsWithCompletionHandler:^(NSArray<NSString *> * _Nonnull h) {
for(NSString *ssid in h){
NSLog(@"ssid %@",ssid);
}
}];
通過以下方法略贮,可以連接特定的SSID
__weak __typeof(self) weakSelf = self;
NEHotspotConfiguration * configuration =
// [[NEHotspotConfiguration alloc] initWithSSID:self.ssid]; //不需要密碼的wifi
[[NEHotspotConfiguration alloc] initWithSSID:self.ssid passphrase:self.pass isWEP:NO]; //需要密碼的wifi
// configuration.joinOnce = YES;
[[NEHotspotConfigurationManager sharedManager]
applyConfiguration: configuration
completionHandler: ^ (NSError * _Nullable error) {
if (nil == error) {
NSLog(@ "Connected!!");
NSLog(@"weakSelf %@",[weakSelf fetchSSIDInfo]);
[weakSelf GetCurrentWifiHotSpotName];
} else {
NSLog (@ "Error :%@", error);
}}];
需要注意的問題:
- SSID中不可以包含空格,否則無法連接成功
- SSID填寫錯誤或包含了空格仗岖,雖然會創(chuàng)建一個連接逃延,但用戶是無法連接網(wǎng)絡(luò)成功的
- 模擬器上無法運行
- 手機系統(tǒng)必須為iOS 11及更高系統(tǒng)
- 當重復(fù)創(chuàng)建連接時,會拋出一個錯誤轧拄,但用戶任然能連接上
- 若刪除應(yīng)用揽祥,所有創(chuàng)建的連接都會消失