跳到主要內容

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 自行進行登入而已,它並不處理登入的部份,而且登入後您還要透過它通知系統說已經登入了。
    希望對您有幫助。

    回覆刪除

張貼留言

這個網誌中的熱門文章

何謂博士?

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

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 而且沒有過保,建議您測看看,有問題且這問題很困擾您的話,請換修吧!

以 Ad-Hoc 方式測試軟體 iOS 7.1 裝置需要使用具 SSL 憑證的伺服器

在進行 iOS 的 app 開發時,常需要讓一些團隊成員或測試者測試 beta 版的 app。如果您以 Ad-Hoc 方式發送測試用 app 給測試者下載安裝的話,使用者的裝置若已更新至 iOS 7.1,則您需要找個有 SSL 憑證,支援 HTTPS 的 host 來放置您的 app,否則測試者要下載測試軟體時,會遇上憑證無效的錯誤訊息而無法下載安裝。 提供給您參考,若您有相關的解決方法,也請不吝賜教分享給大家。 [更新] 可將 ipa 與 plist 檔上傳到 Dropbox 中的"公開檔夾(public)"中,然後連到 itms-services://?action=download-manifest&amp;url=<plist 檔的位置>,即可進行 Ad Hoc 的發佈。當然,測試者的裝置需經過開發裝置的 UDID 碼註冊才行。 另外,Google Site 因不支援以 itms-services:// 的協定連結,所以無法透過 Google Site 的連結來進行 Ad Hoc 的發佈。  [回覆 -> 天天網友] 請如圖所示般,複製 .ipa 檔的公開連結,將 .ipa 的公開連結加到 .plist 檔中。以同樣的方法複製 .plist 檔的公開連結,並將連到 .plist 檔的超連結寫成 itms-services://?action=download-manifest&amp;url=<plist 檔超連結> 的形式(沒有角括號),放在網頁中,或以電郵傳給測試者,點選之後,即可將 .ipa 檔下載安裝。不是以 HTML 的 <a href=""> 來連結。 您的問題應該是沒有在網頁的連結中使用 itms-services:// 的方式來進行連結,或不是連結到 .plist 的公開連結上。 .plist 的 URL 看起來會像是 https://dl.dropboxusercontent.com/u/xxxxxxx/xxxxxx/xxxxxxxx.plist。網頁中連結的寫法是 <a href=itms-services://?action=download-manifest&amp;url=https://dl.dropboxuserco...