跳到主要內容

iOS CaptiveNetwork API 的用法

Image

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 定義檔引入。

螢幕快照 2013-12-30 上午3.12.04

小弟將註冊 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");


通知系統說,認證不通過,這個網路無法使用。

留言

  1. 你好。
    嘗試用CNMarkPortalOnline,但總是回 FALSE。

    CNCopySupportedInterfaces 回的是"en0".

    手機wifi有打開,未連上目標SSID。請問知道大概是什麼原因嗎?

    回覆刪除
  2. 您好。CNMarkPortalOnline 是用來在您已使用客製方式登入 WiFi 網路後,通知系統說您已登錄該網路了。它本身並不會幫您登入,登入網路的部份是您要自己寫的。這個方法只是通知系統說已經登錄完成了。
    en0 指的應是裝置上的 WiFi 網路介面,這個方法傳回 en0 表示CaptiveNetwork 已經在監視手機上的 WiFi 網路。WiFi 有開所以 CaptiveNetwork 會監視 WiFi 網路。
    未連上目標 SSID,則請開啟設定手動選取 WiFi 網路,或將該 WiFi 網路設成"自動連結"(不是"自動登入",這個選項會讓 iOS 跳出網頁登入的介面)。
    換句話說阿婆的 CaptiveNetwork 只是讓您繞過 iOS 自行進行登入而已,它並不處理登入的部份,而且登入後您還要透過它通知系統說已經登入了。
    希望對您有幫助。

    回覆刪除

張貼留言

這個網誌中的熱門文章

iPod、iPhone 與 iPad 的螢幕自動亮度問題

許多使用 iDevice 的網友應該有注意到螢幕自動亮度的問題,約在 iOS 5 或 iOS 6 時,自動亮度的運作方式似乎有些調整,不會再像以前那樣,螢幕亮度會隨環境不同而即時自動調整。目前觀察到的現象是,會自動調亮但不會自動調暗。 要確認您的 iDevice 裝置上的自動亮度運作是否有問題,可以依照下列的操作檢查看看,雖然有網友說這叫校正,但個人並不覺得下列操作是在進行亮度感應器的校正。 1。將機子帶到暗處(也可以將光感應器遮起來),將亮度滑桿拉到最暗的位置,並將自動調整亮度關閉。 2。將機子帶到亮處,開啟自動亮度。此時應可看到螢幕會漸漸變亮,而亮度滑桿也會往右滑。如果您的機子不會變亮,請 Reset 後(久按睡眠/開啟鍵與 Home 鍵至白蘋果出現)再試看看。如果您的機子像小弟的一樣亮度會變化,那應該就是正常的。如果 Reset 後還是不會作動,可能就是機子的問題。 但如果您又將機子帶到暗處,很抱歉,這時螢幕就不會變暗了。有人說這是 Bugs,有人說這是阿婆怕使用者將機器橫拿時遮到感應器而特別設定的,不論如何,不能自動變暗會讓習慣在晚上使用機子的朋友感到困擾,而這到底是蟲還是故意設定成如此,這就有待證實。 如果環境的照明條件變了但機子不會調暗時,您可以按一下睡眠/開啟鍵讓機子進入休眠,然後再開啟,這時畫面亮度應該就會停在適當的亮度狀態了。 後記:小弟在 iPad mini 與 iPad 2 上測試,iPad mini 運作正常(如大多數朋友所觀察到的狀況),但 iPad 2 在升級到 iOS 6 之後,亮度感應器就都沒有作動,不管怎麼調整都沒有辦法讓亮度自動改變。小弟的 iPad 2 是整修機,而且也過保了,如果您手頭上現還有 iPad 2 而且沒有過保,建議您測看看,有問題且這問題很困擾您的話,請換修吧!

BlackStone 與 Windows 7 的同步設定

很好設,只要把黑石接上電腦,Windows 7 會自動下載所需的相關軟體,安裝好後就可以同步了。同步的設定請參考相關手冊。個人認為這是有史以來最好設定的了。 有黑石的朋友,如果您最近也更新到 Windows 7,那千萬就不要再裝 WMDC (Windows Mobile Device Center)了,那反而會讓您的黑石沒辦法與電腦同步,而且還會有一項驅動程式更新的,沒辦法移除。 直接把黑石用 USB 接上,第一次會要等相關的驅動與 WMDC 下載,安裝好後,就可以進行同步了。小弟現在也設了藍芽同步,同樣運作的很好。 提供給大家參考。

何謂博士?

在 簡睿隨筆網誌 中閒逛,無意間發現了這一篇文章,個人覺得寫得很好,特此引用其中一張圖,希望傳佈給更多朋友知道。 這張圖是該文章提到 Ph.D 是什麼時所用的圖,黑線是表示人類目前所瞭解的知識領域,而紅色區域的部份就是個人透過不斷學習所累積的知識,而所謂的 Ph.D. 就是在知識領域的某一點有特別的進展,進而讓人類的知識領域又擴展「一點點」的人。 個人從這篇文章以及自身的體驗中看到至少三件事。首先,大自然是浩瀚無涯的,不管人類再怎麼發展進步,總還是會有未知的地方,所以人要謙卑。其次,要不斷地努力,才能有所突破。最後,在人類的知識領域中,既使您已經是某個領域或一些領域的 Ph.D 了,您不知道的事情還多著呢! 努力、謙卑,就是小弟看完這篇文章後感受到的。