好久沒有寫部落格了,最近在做iOSWIFi開發的部分,這裡我們主要用到的API以及FrameWork有以下:
- NetworkExtension.framework
- NEHotspotHelper
一 申請
準備條件:
- 1 付費的開發者賬號
- 2 公司的WebSite
- 3 明確你的Wifi開發需求
申請步驟: 申請網址 developer.apple.com//contact/ne… 填寫申請的相關資料
根據你專案中的具體情況,在相對應的地方打鉤- 上述表填寫完畢之後,傳送之後,沒多久會受到一封郵件,郵件的大致內容為
大致意思就是從16年11月10日開始 可以在開發者賬戶的account頁面建立APPID的時候新增網路擴充套件
- Note:NetWork Extensions能做的有限,可以獲取WiFi名字和mac地址,但是註冊改變Wifi設定頁面子title 設定密碼 並可以進行連線 這仍需我們申請並獲取HotsPotHelperApi的使用許可權 過兩週或者更久可以收到Apple回覆的是否通過的Email,如果失敗了不要氣餒,據很多小夥伴反應,比追姑娘都要麻煩?
二 使用
在這裡我就不多加贅述,WIFi開發的相關資料雖然很少,但是申請成功後,如何在專案中配置,這部分的文章網上有很多,具體配置給你們推薦兩篇文章好吧
一些相關屬性
- SSID:Wifi 名稱
- BSSID:站點的 MAC 地址
- signalStrength: Wifi訊號強度,該值在0.0-1.0之間
- secure:網路是否安全 (不需要密碼的 Wifi,該值為 false)
- autoJoined: 裝置是否自動連線該 Wifi,目前測試自動連線以前連過的 Wifi 的也為 false
- justJoined:網路是否剛剛加入
- chosenHelper:HotspotHelper是否為網路的所選助手
部分使用程式碼
Register a Hotspot Helper
+ (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler
@param options
kNEHotspotHelperOptionDisplayName :WIFI的註釋tag字串// 此處設定的內容會在WiFi列表中每個WiFi下邊展示出來
@param queue dispatch_queue_t 用來呼叫handle的block
@param handler NEHotspotHelperHandler block 用於執行處理 helper commands.
@return 註冊成功YES, 否則NO.
@discussion 一旦這個API呼叫成功,應用程式有資格在後臺啟動,並參與各種熱點相關的功能。 當應用程式啟動此方法應該呼叫一次。再次呼叫它不會產生影響,並返回NO。
這個方法是主要的.
複製程式碼
+ (BOOL)logoff:(NEHotspotNetwork *)network
@param network 對應當前關聯的WiFi網路NEHotspotNetwork
@return 登出命令已成功進入佇列YES, 否則NO.
@discussion 呼叫此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand嚮應用程式發出的“handler”模組 網路引數必須符合當前關聯的WiFi網路,即它必須來自對NEHotspotHelperCommand網路屬性或方法supportedInterfaces
+ (NSArray *)supportedNetworkInterfaces
@return 如果沒有網路介面被管理,返回nil。否則,返回NEHotspotNetwork物件陣列。
@discussion 每個網路介面由NEHotspotNetwork物件表示。當前返回的陣列包含一個NEHotspotNetwork物件代表Wi-Fi介面。
這種方法的主要目的是當沒有得到一個命令來處理它時,讓一個熱點助手偶爾提供在UI裡其準確的狀態。 此方法加上NEHotspotNetwork的isChosenHelper方法允許應用程式知道它是否是當前處理的網路。
複製程式碼
- 獲取wifi列表,並給系統設定頁面Wifi設定子標題 可以獲得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 必須進入到系統WIFI設定頁面才可以獲取到WIFI列表(包括強度 WIFI名稱)參考WIFI萬能助手 可能都是通過LBS一些方法告訴你附近可能存在的WIFI,然後通過點選推薦的WIFI 進入下一步
- 2 點選上方任意一個可能存在的WIFI,因為Apple政策原因 無法再APP內直接連線WIFI!!! 所以萬能鑰匙的策略是 如下圖,提供你個連線教程,將可以連線的WIFI名稱進行更改,在下方加上提示文字 比如 ?萬能WIFI - 點選一鍵上網? 
通過這樣的方式進行連線
這裡萬能鑰匙的做法是幫助使用者跳到wifi系統設定頁面,市面上還有很多需要使用者自己手動進入WIFI設定頁面的App,比如360免費wifi,這樣雖然犧牲了一部分使用者體驗,但是在稽核方面可以通過率大大增加,還是比較值得倡導的- 3 不能主動通過程式碼的方式斷開WIFI 比如 有一個按鈕叫做斷開WIFI 這樣是不允許的 只能通過使用者手動關閉WIFI或者WIFI本身無法連線網路只能通過判斷當前網路狀態的方式進行連線
四 總結
iOS wifi開發相關資料較少,Apple對這方面的稽核也較為嚴格 希望這篇文章可以幫助到正在做wifi開發相關的小夥伴們,加油!