iOS之Wifi開發(fā)探究

好久沒有寫博客了,最近在做iOSWIFi開發(fā)的部分,這里我們主要用到的API以及FrameWork有以下:

  • NetworkExtension.framework
  • NEHotspotHelper

一 申請

準備條件:

  • 1 付費的開發(fā)者賬號
  • 2 公司的WebSite
  • 3 明確你的Wifi開發(fā)需求

申請步驟:
申請網(wǎng)址 https://developer.apple.com//contact/network-extension/ 填寫申請的相關(guān)資料

image.png

根據(jù)你項目中的具體情況,在相對應(yīng)的地方打鉤

image.png
  • 上述表填寫完畢之后,發(fā)送之后,沒多久會受到一封郵件,郵件的大致內(nèi)容為
image.png

大致意思就是從16年11月10日開始 可以在開發(fā)者賬戶的account頁面創(chuàng)建APPID的時候添加網(wǎng)絡(luò)擴展

image.png
  • Note:NetWork Extensions能做的有限,可以獲取WiFi名字和mac地址,但是注冊改變Wifi設(shè)置頁面子title 設(shè)置密碼 并可以進行連接 這仍需我們申請并獲取HotsPotHelperApi的使用權(quán)限 過兩周或者更久可以收到Apple回復的是否通過的Email,如果失敗了不要氣餒,據(jù)很多小伙伴反應(yīng),比追姑娘都要麻煩??

二 使用

在這里我就不多加贅述,WIFi開發(fā)的相關(guān)資料雖然很少,但是申請成功后,如何在項目中配置,這部分的文章網(wǎng)上有很多,具體配置給你們推薦兩篇文章好吧

一些相關(guān)屬性
  • SSID:Wifi 名稱
  • BSSID:站點的 MAC 地址
  • signalStrength: Wifi信號強度,該值在0.0-1.0之間
  • secure:網(wǎng)絡(luò)是否安全 (不需要密碼的 Wifi,該值為 false)
  • autoJoined: 設(shè)備是否自動連接該 Wifi,目前測試自動連接以前連過的 Wifi 的也為 false
  • justJoined:網(wǎng)絡(luò)是否剛剛加入
  • chosenHelper:HotspotHelper是否為網(wǎng)絡(luò)的所選助手

部分使用代碼

Register a Hotspot Helper

+ (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler

@param options 

 kNEHotspotHelperOptionDisplayName :WIFI的注釋tag字符串// 此處設(shè)置的內(nèi)容會在WiFi列表中每個WiFi下邊展示出來 

@param queue dispatch_queue_t 用來調(diào)用handle的block 

@param handler NEHotspotHelperHandler block 用于執(zhí)行處理 helper commands.

 @return 注冊成功YES, 否則NO. 

@discussion 一旦這個API調(diào)用成功,應(yīng)用程序有資格在后臺啟動,并參與各種熱點相關(guān)的功能。 當應(yīng)用程序啟動此方法應(yīng)該調(diào)用一次。再次調(diào)用它不會產(chǎn)生影響,并返回NO。

這個方法是主要的.
+ (BOOL)logoff:(NEHotspotNetwork *)network

@param network 對應(yīng)當前關(guān)聯(lián)的WiFi網(wǎng)絡(luò)NEHotspotNetwork

 @return 注銷命令已成功進入隊列YES, 否則NO. 

@discussion 調(diào)用此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向應(yīng)用程序發(fā)出的“handler”模塊 網(wǎng)絡(luò)參數(shù)必須符合當前關(guān)聯(lián)的WiFi網(wǎng)絡(luò),即它必須來自對NEHotspotHelperCommand網(wǎng)絡(luò)屬性或方法supportedInterfaces

+ (NSArray *)supportedNetworkInterfaces

@return 如果沒有網(wǎng)絡(luò)接口被管理,返回nil。否則,返回NEHotspotNetwork對象數(shù)組。 

@discussion 每個網(wǎng)絡(luò)接口由NEHotspotNetwork對象表示。當前返回的數(shù)組包含一個NEHotspotNetwork對象代表Wi-Fi接口。

 這種方法的主要目的是當沒有得到一個命令來處理它時,讓一個熱點助手偶爾提供在UI里其準確的狀態(tài)。 此方法加上NEHotspotNetwork的isChosenHelper方法允許應(yīng)用程序知道它是否是當前處理的網(wǎng)絡(luò)。
  • 獲取wifi列表,并給系統(tǒng)設(shè)置頁面Wifi設(shè)置子標題 可以獲得wifi名稱,信號強度,mac地址等等
+(void)getWifiList{

    NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
    [options setObject:@"??Wifi子標題??" forKey:kNEHotspotHelperOptionDisplayName];

    dispatch_queue_t queue = dispatch_queue_create("com.pronetwayXY", NULL);
    BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
        NEHotspotNetwork* network;
        NSLog(@"COMMAND TYPE:   %ld", (long)cmd.commandType);
        [cmd createResponse:kNEHotspotHelperResultAuthenticationRequired];
        if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {
            NSLog(@"WIFILIST:   %@", cmd.networkList);
            for (network  in cmd.networkList) {
                // NSLog(@"COMMAND TYPE After:   %ld", (long)cmd.commandType);
                if ([network.SSID isEqualToString:@"ssid"]|| [network.SSID isEqualToString:@"proict_test"]) {

                    double signalStrength = network.signalStrength;
                    NSLog(@"Signal Strength: %f", signalStrength);
                    [network setConfidence:kNEHotspotHelperConfidenceHigh];
                    [network setPassword:@"password"];

                    NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
                    NSLog(@"Response CMD %@", response);

                    [response setNetworkList:@[network]];
                    [response setNetwork:network];
                    [response deliver];
                }
            }
        }
    }];
    NSLog(@"result :%d", returnType);
    NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
    NSLog(@"wifiArray:%@", array);
    NEHotspotNetwork *connectedNetwork = [array lastObject];
    NSLog(@"supported Network Interface: %@", connectedNetwork);

}

三 思考

  • 1 必須進入到系統(tǒng)WIFI設(shè)置頁面才可以獲取到WIFI列表(包括強度 WIFI名稱)參考WIFI萬能助手 可能都是通過LBS一些方法告訴你附近可能存在的WIFI,然后通過點擊推薦的WIFI 進入下一步
image.png
  • 2 點擊上方任意一個可能存在的WIFI,因為Apple政策原因 無法再APP內(nèi)直接連接WIFI!??! 所以萬能鑰匙的策略是
    如下圖,提供你個連接教程,將可以連接的WIFI名稱進行更改,在下方加上提示文字 比如 ??萬能WIFI - 點擊一鍵上網(wǎng)??


    image.png

通過這樣的方式進行連接

image.png

這里萬能鑰匙的做法是幫助用戶跳到wifi系統(tǒng)設(shè)置頁面,市面上還有很多需要用戶自己手動進入WIFI設(shè)置頁面的App,比如360免費wifi,這樣雖然犧牲了一部分用戶體驗,但是在審核方面可以通過率大大增加,還是比較值得倡導的

  • 3 不能主動通過代碼的方式斷開WIFI 比如 有一個按鈕叫做斷開WIFI 這樣是不允許的 只能通過用戶手動關(guān)閉WIFI或者WIFI本身無法連接網(wǎng)絡(luò)只能通過判斷當前網(wǎng)絡(luò)狀態(tài)的方式進行連接

四 總結(jié)

iOS wifi開發(fā)相關(guān)資料較少,Apple對這方面的審核也較為嚴格 希望這篇文章可以幫助到正在做wifi開發(fā)相關(guān)的小伙伴們,加油!

最后編輯于
?著作權(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)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 例如點擊手勢 創(chuàng)建點擊手勢 UITapGestureRecognizer*tap = [[UITapGesture...
    Smile_J閱讀 4,012評論 3 0
  • 不同的時代,有不同的使命。跟上時代的步伐,則創(chuàng)造歷史,名垂史冊,沒有跟上,則被邊緣化。 歷史上曾多次把...
    李清振閱讀 1,709評論 1 7

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