跳到主要內容

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...

某些特定的 iOS 開發者遭受由 iMessage 而來的 DoS 攻擊

據 MacRumors 引述 The Next Web 的報導指出,某些特定的 iOS 開發者遭受由 iMessage 而來的 DoS(Denial of Service)。 據遭受鎖定的 iOS 開發者 Grant Paul 的說明,Apple 並沒有為 iMessage 的訊息傳輸量設限,所以攻擊者可以用短時間內發出大量訊息的方式來進行阻斷式攻擊。另外,攻擊者也可發出以 Unicode 編碼的"複雜"文字或數量龐大的文字訊息,讓 iMessage 受不了,無法計算(render)文字訊息,這就可以讓 iMessage 無法順利開啟。 文章中也提到 iH8sn0w 這位越獄工具與軟體的開發者指出,透過 AppleScript 就可以發出這種 DoS 的攻擊。 有興趣的朋友可以跳轉收看。

Google Spaces 社群通訊的新選擇

繼 Google+ 之後,Google 再發表 Spaces 搶佔社群通訊的市場。與 Line、Facebook Messenger 類似,Google Spaces 讓使用者可以在建立群組空間後,將親朋好友加進群組中,隨時張貼分享連結、圖片、YouTube 影片與文字訊息,而且可針對某某個貼文發起群組對話。 使用 Spaces 需要有 Google 帳號,相信在使用者普遍擁有 Google 帳號的情況下,這不會是問題。底下由小弟截圖說明一下 Web 版的操作概況,有興趣的朋友們,可以試用看看。Google Spaces 官網:https://get.google.com/spaces/ Google Spaces 官網   登入 Google 帳號後可建立群組空間   按下透過下列方式邀請,可以複製連結、電子郵件與 Facebook 的方式來邀請親朋好友。 分享的貼文   在群組中分享連結   在群組中分享圖片   在群組中張貼文字訊息 介面簡潔,操作容易,有 Google 帳號的朋友用來應該很方便。Google Spaces 也有 Android 與 iOS 的版本,在手機上也可以使用。 小弟也弄了個群組,https://goo.gl/spaces/139AccKnTA7TvaXe6,雖然與老宅男沒什麼好聊的,但歡迎您加入,測試一下 Google Spaces,:p。 **本來想透過學校的 Google App for Education 帳號來使用,如此工作或教學上就比較方便,沒想到目前 Google Spaces 目前尚未支援 GAP for Education 的帳號,希望 Google 可以很快就提供 Spaces 給教育單位的帳號使用。**