iOS 沒法獲取 WiFi 列表?必定是由於你不知道這個框架

2017-03-09 | EyreFree | iOS

概述

iOS 9 發佈以後,蘋果推出了 NetworkExtension,利用這個框架能夠實現不少和網絡相關的操做。本文主要介紹怎樣使用其中的 NEHotspotHelper 進行設備 WiFi 列表的獲取。ios

Demo 地址:github.com/EyreFree/EF…git

一. 注意事項

  1. 首先,NEHotspotHelper 只在 iOS 9 及以上版本獲得支持,以前版本的 iOS 並不支持該功能;
  2. 而後,你須要有一個開發者帳號;
  3. 最後,該框架目前尚未大規模開放使用,因此須要向蘋果發送申請而且審覈經過纔可以得到使用該框架的權限,大體內容就是描述一下你須要使用該框架的緣由之類的,而後我是用的英文進行描述(感謝百度以及谷歌翻譯),不過聽說中文也行。提交申請後大概一週內會收到反饋郵件,申請地址爲: developer.apple.com/contact/net…

二. 建立 App ID

打開蘋果開發者中心,登錄而後找到 App IDs 選項,點擊右上角按鈕建立一個 App ID 用於接下來建立 Provisioning Profile,地址爲: developer.apple.com/account/ios… ,如圖所示:github

建立 App ID

首先,填寫 Name 以及 Bundle ID,這裏統一填寫爲 EFNEHotspotHelperDemo,如圖所示:數組

填寫 Name

填寫 Bundle ID

接下來這一步注意須要勾選 Wireless Accessory Configuration 這一選項,如圖所示:bash

勾選 Wireless Accessory Configuration

而後觀察到如圖所示狀態代表已成功打開:網絡

狀態顯示

在 App IDs 列表中查看剛建立完成的 App ID:app

App IDs 列表

三. 建立 Provisioning Profile

找到 Provisioning Profiles 選項,點擊右上角按鈕建立一個 Provisioning Profile 用於接下來建立示例工程,地址爲: developer.apple.com/account/ios… ,如圖所示:框架

建立 Provisioning Profile

首先選擇 Profile 類型,這裏我選擇的是 iOS App Development,能夠根據本身的具體須要自由選擇:less

選擇 Profile 類型

接下來選擇咱們在第二步建立好的 App ID,如圖所示:ide

選擇 App ID

而後選擇證書和設備,全選便可:

選擇證書

選擇設備

在額外權限這一步須要選中咱們申請到的 Network Extension 權限,能夠看到其中包含咱們須要使用的 NEHotspotHelper 權限,如圖所示:

選中 Network Extension 權限

填寫完 Profile Name 以後,便可成功建立咱們須要的 Profile:

填寫 Profile Name

點擊 Download 將它下載到本地:

下載 Profile

雙擊打開,便可將 Profile 添加到本機:

添加 Profile

能夠到 XCode 的帳戶設置裏查看已安裝的 Profile,若未安裝成功能夠嘗試點擊 Action 中的 Download 按鈕從新下載:

查看已安裝的 Profile

四. 建立工程

接下來咱們建立一個示例工程,演示如何獲取 WiFi 列表。首先,將 Bundle ID 改成以前設置的 EFNEHotspotHelperDemo:

修改 Bundle ID

而後在 Info.plist 中添加後臺模式權限數組:

添加後臺模式代碼

代碼以下:

<key>UIBackgroundModes</key>
<array>
  <string>network-authentication</string>
</array>
複製代碼

添加完成後能夠在 Target -> Capabilities 中看到後臺模式已處於開啓狀態:

後臺模式已開啓

接下來在 Capabilities 找到 Wireless Accessory Configuration 並將其打開:

打開 Wireless Accessory Configuration

在工程中找到名爲 {工程名}.entitlements 的文件,例如 Demo 中的應爲 EFNEHotspotHelperDemo.entitlements,在其中加入 HotspotHelper 權限代碼:

添加 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 值,不然 No
    NSLog(@"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


本文連接:lpd-ios.github.io/2017/03/09/…

若有任何知識產權、版權問題或理論錯誤,還請指正。

轉載請註明原做者及以上信息。

相關文章
相關標籤/搜索