iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架
iOS 9 發布之后,蘋果推出了 NetworkExtension,利用這個框架可以實現很多和網絡相關的操作。本文主要介紹怎樣使用其中的 NEHotspotHelper 進行設備 WiFi 列表的獲取。如果你只是想獲取當前設備正在連接的 WiFi 信息,有更加便捷的方法,可參考我的另一篇文章:iOS 獲取當前已連接 WiFi 信息。
Demo 地址:github.com/EyreFree/EF…
一. 注意事項
二. 創建 App ID
打開蘋果開發者中心,登陸然后找到 App IDs 選項,點擊右上角按鈕創建一個 App ID 用于接下來創建 Provisioning Profile,地址為: developer.apple.com/account/ios… ,如圖所示:
首先,填寫 Name 以及 Bundle ID,這里統一填寫為 EFNEHotspotHelperDemo,如圖所示:
接下來這一步注意需要勾選 Wireless Accessory Configuration 這一選項,如圖所示:
然后觀察到如圖所示狀態表明已成功打開:
在 App IDs 列表中查看剛創建完成的 App ID:
三. 創建 Provisioning Profile
找到 Provisioning Profiles 選項,點擊右上角按鈕創建一個 Provisioning Profile 用于接下來創建示例工程,地址為: developer.apple.com/account/ios… ,如圖所示:
首先選擇 Profile 類型,這里我選擇的是 iOS App Development,可以根據自己的具體需要自由選擇:
接下來選擇我們在第二步創建好的 App ID,如圖所示:
然后選擇證書和設備,全選即可:
在額外權限這一步需要選中我們申請到的 Network Extension 權限,可以看到其中包含我們需要使用的 NEHotspotHelper 權限,如圖所示:
填寫完 Profile Name 之后,即可成功創建我們需要的 Profile:
點擊 Download 將它下載到本地:
雙擊打開,即可將 Profile 添加到本機:
可以到 XCode 的賬戶設置里查看已安裝的 Profile,若未安裝成功可以嘗試點擊 Action 中的 Download 按鈕重新下載:
四. 創建工程
接下來我們創建一個示例工程,演示如何獲取 WiFi 列表。首先,將 Bundle ID 改為之前設置的 EFNEHotspotHelperDemo:
然后在 Info.plist 中添加后臺模式權限數組:
代碼如下:
<key>UIBackgroundModes</key> <array><string>network-authentication</string> </array> 復制代碼添加完成后可以在 Target -> Capabilities 中看到后臺模式已處于開啟狀態:
接下來在 Capabilities 找到 Wireless Accessory Configuration 并將其打開:
在工程中找到名為 {工程名}.entitlements 的文件,例如 Demo 中的應為 EFNEHotspotHelperDemo.entitlements,在其中加入 HotspotHelper 權限代碼:
代碼如下:
<key>com.apple.developer.networking.HotspotHelper</key> <true/> 復制代碼好了,到這里已經完成了各種亂七八糟的配置工作,可以嘗試進行 Build。如果沒有提示錯誤信息的話,接下來就可以愉快地使用 HotspotHelper 了;如果有問題的話,請檢查之前的步驟是否都已正確完成或者根據錯誤信息修改具體項目。
五. 核心代碼
首先,在需要使用 HotspotHelper 的地方添加頭文件引用,這里以 Objective-C 代碼為例:
#import <NetworkExtension/NetworkExtension.h> 復制代碼然后使用如下代碼即可將 WiFi 列表信息打印到 XCode 控制臺,注意:這里需要打開系統 設置 中的 無線局域網 頁面才能獲取相關信息,因為打開該頁面系統刷新 WiFi 信息時才會觸發該回調:
- (void)scanWifiInfos{NSLog(@"1.Start");NSMutableDictionary* options = [[NSMutableDictionary alloc] init];[options setObject:@"EFNEHotspotHelperDemo" forKey: kNEHotspotHelperOptionDisplayName];dispatch_queue_t queue = dispatch_queue_create("EFNEHotspotHelperDemo", NULL);NSLog(@"2.Try");BOOL returnType = [NEHotspotHelper registerWithOptions: options queue: queue handler: ^(NEHotspotHelperCommand * cmd) {NSLog(@"4.Finish");NEHotspotNetwork* network;if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {// 遍歷 WiFi 列表,打印基本信息for (network in cmd.networkList) {NSString* wifiInfoString = [[NSString alloc] 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"); } 復制代碼六. 演示
唔,Demo 運行效果如下,點擊 Open WiFi Setting 按鈕可直接打開 無線局域網 頁面:
具體可嘗試下載 Demo 并完成相應配置后體驗:github.com/EyreFree/EF…
七. 備注
參考以下資料完成本 Demo,在此表示感謝:
iOS 9.0 搜索附近Wi-Fi熱點 IOS NetworkExtension 框架使用筆記 iOS NEHotspotHelper使用 iOS-NetworkExtension-NEHotspotHelper API Reference - NetworkExtension
八. 附錄
Network Extension 申請表格填寫及郵件往來
如有任何知識產權、版權問題或理論錯誤,還請指正。
https://juejin.im/post/5a3214cd51882506fd589047
轉載請注明原作者及以上信息。
總結
以上是生活随笔為你收集整理的iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA学期总结
- 下一篇: 【全记录】2017云栖大会·北京峰会——