最近比較空閑,一直在最佳化之前的移植代碼。之前撥號介面一直有那麼點問題,所以今天重新看了下IAP相關的代碼,總結如下。
一般程式在使用RConnection進行撥號連線時,預設會彈出一個存取點列表框,讓你選擇指定的IAP進行撥號。現在很流行自繪UI,這個系統列表框就會與程式顯得有點格格不入,同時也考慮使用者體驗的問題,有些程式就希望將這個列表框隱藏起來。想要隱藏起來,就需要程式去遍曆手機裡的IAP列表,並選擇其中一個的IAP ID值,然後進行撥號。
遍曆有兩種方法,第一種是訪問資料庫CommDb,需要開啟IAP表,其中的COMMDB_NAME欄位是串連名字,COMMDB_ID即撥號所需的IAP ID值;第二種是用一個封裝好的類CApSelect,ISP類型和Bearer類型都設定為All Type,就可以調用CApSelect::Name()和CApSelect::Uid()擷取每個IAP的名字和ID值。
擷取手機上的所有IAP之後,接下來就是選擇具體哪一個IAP的問題了。一般撥號分cmwap和cmnet兩種,wifi不在本文討論範圍之內。我看了下CApSelect提供的方法,只能擷取IAP的ISP類型和Bearer類型,雖然一直沒弄清楚這兩個值具體是什麼用的,但經測試貌似是不能作為區分cmwap和cmnet的,那麼最終還是要訪問資料庫的。
回顧一下代碼建立一個IAP的過程,cmnet和cmwap都會建立好幾個相關的表,唯一區別在於cmwap需要在PROXIES表裡相關的記錄中添加Proxy 位址(10.0.0.172)和連接埠(80)等資訊,cmnet則需要刪除PROXIES表中那條相關的記錄。我看了了很多網上搜尋IAP的代碼,基本都是兩種:1、搜尋IAP表中的COMMDB_NAME欄位;2、搜尋OUTGOING_GPRS表中的GPRS_APN欄位,然後通過IAP的IAP_SERVICE欄位和OUTGOING_GPRS的COMMDB_ID欄位來關聯兩個表。一個是串連的名稱,一個是存取點的名稱,看其中是否有關鍵字“cmnet”和“cmwap”。但事實上這兩個值並不是固定的,使用者完全可以在設定-串連-存取點中將這兩個值改寫成任意的值。所以想靠名字來區分是非常不可靠的做法。有一種思路,是根據建立IAP時的不同處入手,看和OUTGOING_GPRS裡每條記錄所關聯的PROXIES表中的記錄是否存在,來區分,這個暫時還沒有測試過。
還有一種做法,就是當搜尋不到名為“cmnet”和“cmwap”的IAP時,程式自動建立一個,這樣以後的串連都可以使用這個IAP來撥號了。當然你得保證你的建立IAP程式是正確的。
不過話說回來,我覺得最好的方法還是由使用者自己來選擇存取點,也最保險。我看了下其他四款軟體,其中UcWeb、QQ2010、酷伴,撥號時都是會彈出存取點列表框的,而QQ遊戲大廳的做法更好,列表框也是自繪的,這樣也統一了程式UI風格。
建立IAP的代碼可以參考這個文章:
http://www.devdiv.net/bbs/viewthread.php?tid=24300
至於遍曆代碼參考這個:
http://hi.baidu.com/marktian/blog/item/e7faa0f0bec0eea7a50f52d0.html