跳到主要內容

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

    回覆刪除

張貼留言

這個網誌中的熱門文章

以 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

cleanRAM 中文化

這個軟體更新速度實在很快,目前已經更新到 1.3.0 版了。小弟把新的新版軟體的 下載網頁連結 置於此。中文化檔案大部份相同,與 1.1.8.8 版相較在版權頁上有新增「版權」與「開發者」兩項,小弟在翻譯的用詞上有作了一些修改,也請於此 下載 。 -----------------------------------------------------之前的訊息 cleanRAM 是在 XDA 上的 Ronenpg 大大所提供的記憶體清理工具,目前已經更新到 V1.1.8.8版。cleanRAM 可以把佔用您的機子寶貴記憶體資源的無用程序清除,讓您不須要執行軟重置即可將記憶體清理乾淨。 Ronenpg 大大在其網頁上提供了中文化的方法,小弟就順手把它給中文化了,有需要的朋友,請於 此處下載 。 安裝方法: 將這個「繁體中文.ini」檔放在記憶體或記憶卡的\Program Files\htcAddicts cleanRAM\Lang資料夾中,啟動 cleanRAM Config,選「Menu」/「Setting」在 Language 項下,選用繁體中文,重新啟動 cleanRAM Config 即可。

讓您 HD 上的 TouchFlo 3D 變漂亮

在安裝這些東西之前,請您放心。小弟在這邊介紹的東西,都是可回復的,裝了之後看不順眼可以移除,然後重新軟啟動,就可以恢復成原廠的介面。喜歡的朋友可以裝裝玩玩。這三件工具都是在非常出名的 XDA 論被人提出,經過 Leo 大大的改良,造福國內使用 HD 的朋友。 首先是最簡單的是一件叫 TF3D_Date_Patch 的工具。在 TouchFlo 3D 的首頁中,一般的情況您會看到大大的數字時鐘,而時鐘之下有一排顯示年份與日期的文字,第一個工具就是可以在這個年份與日期後加上星期的,如圖一紅色框的部份。經 Leo 大大的中文化後變成有兩個版本,一版有顯示年份,一版沒有顯示年份。您可以連上 MobileAI 網站 下載安裝使用,完全免費。 圖一:改變後的 TouchFlo 3D 首頁 第二件工具是將 TouchFlo 3D 底下的功能頁籤數增加到十五個。這件叫 TouchHD_TF3D_15Tabs 的工具,可以讓您的 TouchFlo 3D 增加月曆、響鈴模式、通話紀錄與通訊管理員等四個功能頁籤,如圖二。不過所增加的頁籤圖示,並不是像圖一圖二所呈現的那樣,而是與原廠風格相同的科技圖示。想安裝的朋友,一樣可以連上 MobileAI 網站 下載之。 圖二:美化後的15個功能頁籤 第三件工具,ammar_TF3D_15Tabs,是用來將上述第二件工具新增後的總共15個功能頁籤美化。美化後的頁面如圖二所示。另外,經過這個工具美化過後,首頁中的時鐘數字也會變成立體的喔!如圖一中畫紅色底線部份。您當然可以連上 MobileAI 網站 下載使用。 愛漂亮的朋友,可以試試看。如小弟所說的,這邊只介紹「安全」的方法,所以請安心服用,水土不服的話,移除軟體,進行軟啟動便可恢復。