iOS CaptiveNetwork API 的用法
Captive Network 指的是接上 WiFi 基地台後還要經過帳號密碼認證(通常是 Web 介面)才能提供連接 Internet 服務的網路。印象中從 iOS 6 開始系統設定 App 中的 WiFi 選項在您連上的網路是 Captive Network 時,會自動跳出網頁介面的登入畫面供您登入網路使用,如果您在網頁介面中將帳號資料儲存下來的話,下次就可以自動登入。
小弟最近接了一個 case,專案的需求是要 App 自行處理登入的部份。所以就得要透過 iOS 的 CaptiveNetwork 這組 API 來實作了。先說明一點,在 iOS 上從 iOS 5 後,WiFi 的許多功能都被上鎖了,所以沒有 JB 的話,WiFi 的部份在 iOS 上只能抓到目前連上的 WiFi AP 之 SSID、IP 與 BSSID,訊號強度以及附近的 WiFi AP 列表都不開放了。真正…管得很嚴捏!
這組 API 有只有 5 個方法可以用:
CNCopyCurrentNetworkInfo – 用來取得目前連上的 WiFi 網路資訊
CNCopySupportedInterfaces – 用來取得所有 Captive Network 支援的網路介面,比方說 WiFI 還是 3G 等。
CNMarkPortalOffline – 用來通知系統認證的網路不能連網,也就是說在認證失敗時,通知系統這個網路不能連上網。
CNMarkPortalOnline – 用來通知系統認證過的網路已可用來連網,這是在認證成功時,通知系統這個網路已連上網。
CNSetSupportedSSIDs – 用來通知系統,哪些 SSID 要使用 Captive Network,請系統在這些 SSID 連上線時,不要啟用網頁登入機制,改由註冊這些 SSID 的 App 來處理登入工作。
不過,註冊了這些 SSID 後,可別以為系統設定 App 會在您連上某 SSID 時,就會叫用您的 APP 出來處理認證工作。不會的,使用者還是需要手動開啟您的 App 去進行客制化的登入。
要使用這組 API 前,別忘了要在專案的一般設定中,如入 SystemConfiguration 框架,並將 captiveNetwork.h 定義檔引入。
小弟將註冊 SSID 的程式碼寫在 AppDelegate 裡頭:
NSArray* SSIDArray = [[NSArray alloc] initWithObjects:@"SSIDA", @"SSIDB", @"SSIDC", @"SSIDD", nil];
CFArrayRef ssidArray = (__bridge CFArrayRef)SSIDArray;
BOOL captiveNetworkListUpdated = CNSetSupportedSSIDs(ssidArray);
if (captiveNetworkListUpdated)
NSLog(@"CaptiveNetwork updated!");
註冊了這些 SSID 後,設定 App 在連上這些 SSID 時,就不會自動跳出登入網頁讓使用者登入了,但遺憾的連上這些 SSID 時,系統並不會自動啟用您的 App。
別忘了要在認證通過後,寫上:
CFArrayRef myArray = CNCopySupportedInterfaces();
if(CNMarkPortalOnline(CFArrayGetValueAtIndex(myArray, 0)))
NSLog(@"portalOnLined");
通知系統,這個連線已通過認證,可以用來上網了。
如果認證不通過,則寫上:
CFArrayRef myArray = CNCopySupportedInterfaces();
if(CNMarkPortalOffline(CFArrayGetValueAtIndex(myArray, 0)))
NSLog(@"portalOffLined");
通知系統說,認證不通過,這個網路無法使用。
沒有留言:
張貼留言