在看這些經(jīng)驗(yàn)總結(jié)之前,我強(qiáng)烈的建議無(wú)線開發(fā)人員及產(chǎn)品人員熟讀WML的規(guī)范,手冊(cè)地址:
http://www.w3cschool.cn/index-18.asp.htm
根據(jù)我們長(zhǎng)時(shí)間開發(fā)的積累,我們?cè)谑褂眠^(guò)程中確實(shí)遇到的一些問(wèn)題,通過(guò)這些積累,使得我們找到移動(dòng)互聯(lián)網(wǎng)開發(fā)的一些規(guī)律:
1、我可以在屏幕上顯示幾行信息?
事實(shí)上,對(duì)顯示多少行沒(méi)有特別限制,只要不超過(guò)面板的最大尺寸就行(隨設(shè)備的不同而不同)。然而,為了避免太多滾屏,每屏(即卡片)5 至 7 行最佳。當(dāng)然屏不要太多,3-4屏為極限,因?yàn)榭紤]到目前市場(chǎng)上很多的山寨手機(jī)對(duì)WML頁(yè)面大小支持的不好。
2、我們應(yīng)該權(quán)衡GET/POST哪些問(wèn)題?
在實(shí)際開發(fā)中,確實(shí)遇到一些電話不支持使用 POST 方法發(fā)送表單數(shù)據(jù),這種情況,我們確實(shí)沒(méi)有辦法去做兼容了。因?yàn)樵趯?shí)際開發(fā)中,有些數(shù)據(jù)我們必須要為用戶保密,例如用戶名和密碼必須通過(guò) POST 方法發(fā)送。
在 WAP 網(wǎng)關(guān)上,如果日志功能被激活并且請(qǐng)求已被記錄,管理員就有能看到用戶名和密碼。如果網(wǎng)關(guān)是由 ISP 或其它第三方提供的,這個(gè)問(wèn)題就會(huì)特別突出。
即使一個(gè)安全的連接也不能完全消除安全隱患。那些發(fā)送到 WAP 網(wǎng)關(guān)的數(shù)據(jù)使用 WTLS(Wireless Transport Layer Security)加密,它使用與標(biāo)準(zhǔn) TLS 相同的算法。然而,發(fā)送到 WAP 網(wǎng)關(guān)的數(shù)據(jù)是二進(jìn)制的編碼格式(對(duì) WAP),所以這些加密后的數(shù)據(jù)必須用 TLS 解密和再加密以適用于因特網(wǎng)。經(jīng)過(guò)一段時(shí)間以后,敏感數(shù)據(jù)在 WAP 網(wǎng)關(guān)上以明文的形式出現(xiàn)。黑客則會(huì)在適當(dāng)?shù)臅r(shí)刻,將內(nèi)存中的信息轉(zhuǎn)儲(chǔ)出來(lái),進(jìn)而成功地訪問(wèn)這些敏感數(shù)據(jù)。
按照注釋,解決該問(wèn)題的一種辦法是在自己公司(而不是在 ISP)設(shè)一個(gè) WAP 網(wǎng)關(guān)。在這種情況下,一個(gè)可信的人可以操作網(wǎng)關(guān),并且可以關(guān)閉日志功能。
您也可以用 WMLScript 來(lái)編寫自定義的加密算法,以對(duì)客戶端的用戶名和密碼進(jìn)行加密。這只有在使用簡(jiǎn)單的算法時(shí)才有可能實(shí)現(xiàn);在支持 DES 類的算法上,WMLScript 不夠強(qiáng)大。雖然有這么多的顧慮。
我們?cè)趯?shí)際的開發(fā)中選擇的依然首選的是GET。我們建議使用GET方式提交參數(shù),是考慮到URL可移植、保證參數(shù)完整,但是同時(shí)我們?yōu)榱吮C堋⑾揲L(zhǎng)度可以在合適的地方(用戶保密數(shù)據(jù)、參數(shù)可能出現(xiàn)過(guò)長(zhǎng))應(yīng)用POST。
3、我怎樣保持 Session?
我們?cè)僮鋈魏我粋€(gè)模塊設(shè)計(jì)的時(shí)候都不要假設(shè)手機(jī)終端都支持cookie(雖然部分手機(jī)支持cookie,但不能保證用戶都開啟cookie)。這樣,當(dāng)用戶在您的站點(diǎn)的不同頁(yè)面之間穿梭時(shí),為了在服務(wù)器端保留關(guān)于客戶端的信息,在向服務(wù)器發(fā)送每個(gè)請(qǐng)求的同時(shí),一個(gè) Session ID 必須被當(dāng)作參數(shù)傳遞。Session ID 的參數(shù)名根據(jù) Servlet 引擎的不同而不同。
有時(shí),缺省的 Session ID 長(zhǎng)度很大幅度地增加了每個(gè)請(qǐng)求的長(zhǎng)度。結(jié)果導(dǎo)致客戶端或 WAP 網(wǎng)關(guān)可能將此請(qǐng)求看作一個(gè)無(wú)效的 URL 而拒絕。這樣有必要縮短 Session ID 的長(zhǎng)度。可自定義一些所短sessionID長(zhǎng)度的方案。
4、Select 框參數(shù)的提交?
因?yàn)?/span>WAP瀏覽器的簡(jiǎn)陋、多而雜,在不同的瀏覽器里,select提交被截獲的參數(shù)值也是不同的,如在select中,你選中了1/2/3提交后,截取的值,可能是1,2,3,也可能是1;2;3。
這點(diǎn)跟WEB上有些許差異,請(qǐng)大家多注意
5、參數(shù)簡(jiǎn)單化?
在開發(fā)過(guò)程中,我們經(jīng)常是為了頁(yè)面參數(shù)提交的簡(jiǎn)單,即為了減少參數(shù)的提交個(gè)數(shù),我們喜歡在WML頁(yè)面對(duì)一些參數(shù)進(jìn)行拼裝。如下:
<postfield name="content" value="$(bwBall)~$(swBall)~$(gwBall)"/>,實(shí)際操作中,我們應(yīng)該避免這樣的參數(shù)拼裝,僅管在WAP1.1之后確實(shí)支持一些分割符的分隔
6、編碼問(wèn)題同樣是個(gè)詬病?
無(wú)論我們?cè)?/span>J2EE/J2SE開發(fā)過(guò)程中,都會(huì)遇到編碼的問(wèn)題,不同的是WML中遇到的編碼問(wèn)題大多數(shù)并不是我們服務(wù)端導(dǎo)致的,手機(jī)廠商對(duì)編碼沒(méi)有固定的設(shè)置,很多用戶不會(huì)去關(guān)心手機(jī)的編碼,在參數(shù)提交時(shí)如果帶有中文參數(shù),在參數(shù)接收時(shí),就需要對(duì)參數(shù)進(jìn)行處理,因?yàn)榭蛻舳颂峤贿^(guò)來(lái)的可以是ASCII碼
7、“內(nèi)部服務(wù)器錯(cuò)誤”?
如果做WML開發(fā)你沒(méi)遇到過(guò)這類錯(cuò)誤,那你絕對(duì)不是一個(gè)稱職的開發(fā)。在手機(jī)中報(bào)這類錯(cuò)誤,基本上都屬于功能機(jī),對(duì)應(yīng)的 response code 是500。
8、WML頁(yè)面對(duì)圖片的支持度?
在WML頁(yè)面里,圖片是不被建議的,如果非要使用的話,請(qǐng)注意圖片不要多于5張,圖片最好要經(jīng)過(guò)處理,越小越好。另外圖片的格式最好是PNG,如果有條件的話PNG、GIF、JPG最好都備上。
9、轉(zhuǎn)義字符的使用?
在WML中,跟HDML一樣,多個(gè)連續(xù)的空格只顯示一個(gè)空格;在WML中,一定要注意使用轉(zhuǎn)義字符,如:
< ----- <
> ----- >
‘ ----- '
“ ----- "
& ----- &
$ ----- $$
空格 -----
- ----- ­
特別是在URL參數(shù)傳遞過(guò)程中,源碼中&必須寫成&
10、一個(gè)標(biāo)準(zhǔn)的crad?
card是WML的單元,由此,我們可以知道一個(gè)WML頁(yè)面可以有多個(gè)card(靜態(tài)文字預(yù)加載推薦使用)。
如下是一個(gè)WML最基本的元素:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta forua="true" http-equiv="Cache-Control" content="max-age=0"/>
<meta forua="true" http-equiv="Cache-Control" content="no-cache"/>
</head>
<card id="index" title="愛(ài)彩票">
<p>內(nèi)容</p>
</card>
</wml>
11、關(guān)于WML頁(yè)面的表單參數(shù)提交<anchor>?
有一個(gè)標(biāo)準(zhǔn)的表單提交的實(shí)例:
源碼:
<img src="http://wap.baidu.com/logo.gif" alt="Baidu"/>
<input name="word" size="4"/><br/>
<anchor>
搜网页
<go method="get">
<postfield name="word" value="$(word)"/>
<postfield name="tn" value="wisewml"/>
<postfield name="rn" value="5"/>
<postfield name="ie" value="unicode"/>
<postfield name="cl" value="2"/>
<postfield name="vit" value="uni"/>
<postfield name="from" value="578b_w1"/>
</go>
</anchor>|
<anchor>
进贴吧
<go method="get">
<postfield name="kw" value="$(word)"/>
<postfield name="from" value="578b_w2"/>
<postfield name="inb" value="1"/>
</go>
</anchor>
在這里有個(gè)很好的體現(xiàn),提交文字所在的位置,這個(gè)問(wèn)題,針對(duì)小部分手機(jī)會(huì)有差異(會(huì)產(chǎn)生頁(yè)面解析失敗的情況)。我們最好的習(xí)慣是將提交文字寫在<anchor>與<go href=”” method=”get”>之間。
12、WAP如何保證表現(xiàn)層可維護(hù)性?
這可能是最可怕的事情了,由于WAP業(yè)務(wù)的特殊性,合作推廣相對(duì)WAP較頻繁,如果系統(tǒng)開發(fā)人員沒(méi)有一個(gè)好的思想,好的編程習(xí)慣,喜歡將代碼粘來(lái)粘去(特別是頁(yè)面代碼),時(shí)間長(zhǎng)了,這將給系統(tǒng)帶來(lái)毀滅性的結(jié)局。
13、低端機(jī)對(duì)WML標(biāo)簽的支持?
移動(dòng)終端,大家要清楚的就是這是個(gè)以簡(jiǎn)潔為主的地盤,無(wú)論從業(yè)務(wù)上還是從技術(shù)上,WEB人員都喜歡將WEB的一套模式照搬到WAP中來(lái),如果你真的那樣做的話,我要告訴你,你會(huì)死的很慘,很多WEB上的業(yè)務(wù)是跟WAP的用戶群的截然不同的,那么從技術(shù)上來(lái)說(shuō),也是不能通用的。
特別是低端機(jī),很多好的效果,好的模式都是不支持的,所以說(shuō)這是個(gè)簡(jiǎn)單的平臺(tái)。
舉例:在html頁(yè)面我們會(huì)用各種顏色,各種字體,想方設(shè)法的讓展示更炫,WAP行不通的,如下標(biāo)簽就不能通過(guò)---一般手機(jī)會(huì)報(bào):內(nèi)容格式錯(cuò)誤
<b>粗體</b> ---------低端機(jī)不支持
<i>斜體</i> ---------低端機(jī)不支持
<img alt="pic" src="" /> ---------在使用img標(biāo)簽時(shí),alt標(biāo)簽必填
如果你想你的應(yīng)用以展現(xiàn)為主,那么有些豐富頁(yè)面的標(biāo)簽?zāi)憧梢試L試一下,如果你的平臺(tái)是電子商務(wù),那么我奉勸產(chǎn)品及開發(fā)人員,這些標(biāo)簽?zāi)氵€是離它們遠(yuǎn)點(diǎn)。
14、如何去除WAP頁(yè)面輸入框緩存?
在WAP頁(yè)面輸入框的緩存是讓用戶感到很頭疼的東西,很多時(shí)候我們第二次訪問(wèn)同一個(gè)輸入框是想重新輸入值的,結(jié)果頁(yè)面響應(yīng)給我們的框里卻遺留了上一次輸入的值。還需要手動(dòng)的刪除上一次數(shù)據(jù)再重新輸入數(shù)據(jù)。從這個(gè)操作上來(lái)說(shuō)讓用戶體驗(yàn)很不流暢,或者說(shuō)給用戶使用帶來(lái)了阻力。
為了規(guī)避這種輸入框緩存,我們可以利用隨機(jī)數(shù),如參數(shù)param我們可以寫成 param + random
15、部分手機(jī)對(duì)下拉框的支持度?
在開發(fā)過(guò)程中,我們遇到一些奇怪的問(wèn)題,在WAP1.0的手機(jī)里,有些低端的手機(jī)不支持下拉框的定號(hào)選擇。如:
<select name='params'>
<option value='1'>value1</option>
<option value='3'>value3</option>
<option value='5'>value5</option>
<option value='7'>value7</option>
<option value='9'>value9</option>
</select><br/>
原本我們是希望用戶選擇的是3,則我們接受到的也是3,可是不幸的是,我們接收到的是1,通過(guò)多次的查日志驗(yàn)證,確實(shí)有這樣的情況存在,即:該類型的手機(jī)下拉框全部是按照升序的值進(jìn)行傳遞的。那么在我們這個(gè)事例的值就是,0,1,2,3,4而不是1,3,5,7,9。
16、部分手機(jī)對(duì)復(fù)選框的支持?
這個(gè)特性需要產(chǎn)品設(shè)計(jì)人員注意了,在產(chǎn)品設(shè)計(jì)的時(shí)候盡量避免這些復(fù)選的出現(xiàn)。因?yàn)樵诔霈F(xiàn)復(fù)選框的時(shí)候,部分手機(jī)是會(huì)默認(rèn)全選的(如MOTO手機(jī))。