iOS 在APP內(nèi)、應(yīng)用內(nèi) 連接WiFi

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 可以獲取用戶當(dāng)前所有WiFi列表,但此功能需要開發(fā)者申請?zhí)貏e的權(quán)限,申請通過后有兩點需要注意 :

  1. 在.entitlemennts文件里面新增配置:com.apple.developer.networking.HotspotHelper值為YES
  2. 在Info.plist中新增Required background modes, 新增item 值為network-authentication

然后可以通過以下代碼獲取用戶當(dāng)前所有WiFi列表, 通過這個列表,可以獲得每個WiFi的SSID,BSSID等詳細(xì)信息。

  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的一部分,支持用于以下功能:

  1. 可以讓用戶連接另一個智能設(shè)備的WiFi達(dá)到傳輸數(shù)據(jù)的目的,比如連接相機(jī)WiFi來拷貝相機(jī)里面的圖片
  2. 通過以下方式,可以獲取已經(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);
             }}];

需要注意的問題:

  1. SSID中不可以包含空格,否則無法連接成功
  2. SSID填寫錯誤或包含了空格,雖然會創(chuàng)建一個連接,但用戶是無法連接網(wǎng)絡(luò)成功的
  3. 模擬器上無法運(yùn)行
  4. 手機(jī)系統(tǒng)必須為iOS 11及更高系統(tǒng)
  5. 當(dāng)重復(fù)創(chuàng)建連接時,會拋出一個錯誤,但用戶任然能連接上
  6. 若刪除應(yīng)用,所有創(chuàng)建的連接都會消失

PS:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容