PhoneGap開發(fā)初體驗(yàn):用HTML5技術(shù)開發(fā)本地應(yīng)用
PhoneGap是一個(gè)用基于HTML,CSS和JavaScript的,創(chuàng)建跨平臺(tái)移動(dòng)應(yīng)用程序的快速開發(fā)平臺(tái)。開發(fā)的程序?qū)⒉渴鹪谝粋€(gè)特定的操作系統(tǒng)上(如Android,iOS,Windows Phone…),類似于在本地主機(jī)上運(yùn)行的Apache實(shí)例。
需要下載的資源
如果你只是想體驗(yàn)一下PhoneGap,可以只下載一個(gè)PhoneGap包。但是你也許還需要下載一個(gè)Android SDk。Android只是我給出的一個(gè)例子,PhoneGap共支持7種平臺(tái)。
部署時(shí)不需要額外下載Eclipse或者其他的IDEs。我更喜歡使用命令行。
在Android Virtual Device上部署開發(fā)
Android模擬器的速度有點(diǎn)慢,但是這是所有模擬器的通病。參考指導(dǎo)手冊(cè),可以很快地在Android Virtual Device上部署我們的實(shí)例程序。
程序使用了ant,可以方便我們查看我們部署的內(nèi)容:
-
/www/文件夾將作為我們虛擬的web服務(wù)器的根目錄。
-
Android的一些基礎(chǔ)文件,如AndroidManifest.xml。
-
一些JavaScript庫(如phonegap.js),用于在設(shè)備上加載JavaScript代碼。
如果我們需要測(cè)試應(yīng)用程序的用戶體驗(yàn),那么我們不應(yīng)該使用模擬器測(cè)試:它缺乏定位功能和許多其他功能部件;畢竟模擬器并不是真正的手機(jī)。
PhoneGap的實(shí)際作用與設(shè)備的功能有著密切的關(guān)系;我們都清楚瀏覽器的功能(如CSS風(fēng)格,Ajax calls)并不會(huì)隨著平臺(tái)的改變而改變。
在實(shí)際的手機(jī)上部署開發(fā)
我通過Android Market在一個(gè)真正的手機(jī)上安裝了GWT PhoneGap showcase。
應(yīng)用程序的啟動(dòng)時(shí)間和響應(yīng)速度都不錯(cuò),就像是一個(gè)native app。PhoneGap可以從JavaScript中獲提取圖片!它可以用在photocamera程序中,當(dāng)用戶保存(或是刪除)拍攝的照片后,它能夠獲取圖片的文件名。
上面的例子介紹了如何從加速器、方向儀、GPS傳感器(提供經(jīng)度和緯度)中提取數(shù)據(jù)。也可以在瀏覽器中使用本地存儲(chǔ)方式(例如key-value存儲(chǔ))。
后退按鈕(這在跨平臺(tái)的程序中是一個(gè)難題)可以截獲應(yīng)用程序,控制應(yīng)用程序在屏幕上的顯示情況。這一點(diǎn)與native app的功能相似。
API
這個(gè)API是基于JavaScript的:你可以在瀏覽器中調(diào)用它。有一些新的組件目前還沒有相應(yīng)的標(biāo)準(zhǔn):目前還沒有標(biāo)準(zhǔn)規(guī)范如何在瀏覽器中訪問文件。
幸運(yùn)的是,W3C已經(jīng)為其他的組件制定了相應(yīng)的標(biāo)準(zhǔn):瀏覽器上的地理定位,Web SQL以及Web存儲(chǔ)目前已經(jīng)有了統(tǒng)一的規(guī)范。例如:
用來提取位置對(duì)象信息并返回給調(diào)用者。
我只嘗試了在Android設(shè)備上使用PhoneGap,但是Android和iOS都支持各自的API組件。他們都有各自支持的平臺(tái)和API版本。例如,F(xiàn)ile API可用在以下系統(tǒng)上調(diào)用:
-
Android
-
BlackBerry WebWorks (OS 5.0 and higher)
-
iOS
-
Windows Phone 7 ( Mango )
應(yīng)用程序可以訪問一個(gè)www/文件夾,這個(gè)文件夾就相當(dāng)于你的主服務(wù)器。你可以從這個(gè)文件夾下的指定路徑中下載.js文件(其中包括phonegap-1.2.0.js文件,它提供了API調(diào)用)。
也可以通過同樣的方式下載CSS。下載的內(nèi)容都是HTML和一些事件信息,如onclick事件(當(dāng)你點(diǎn)擊手機(jī)或是平板電腦時(shí)產(chǎn)生)。
當(dāng)你使用XMLHttpRequest請(qǐng)求對(duì)象時(shí)可以調(diào)用Ajax:你可以在服務(wù)器端使用JS架構(gòu)存儲(chǔ)數(shù)據(jù),為了節(jié)省帶寬,你應(yīng)該將JS架構(gòu)的資源保存到www/目錄下。XMLHttpRequest可能被發(fā)送給任意一個(gè)服務(wù)器:如果沒有找到滿足要求的服務(wù)器接收請(qǐng)求,那么你的請(qǐng)求將會(huì)被本地服務(wù)器處理。
總結(jié)
開發(fā)者使用PhoneGap的目的是非常明確的。
首先,PhoneGap能夠幫助開發(fā)者節(jié)省帶寬:滿足W3C規(guī)范的離線web應(yīng)用程序目前并不完善;這些規(guī)范執(zhí)行起來較為復(fù)雜,移動(dòng)設(shè)備提供商們往往根據(jù)自己的需要打破規(guī)定(他們更傾向于開發(fā)native app,而不是采用一個(gè)統(tǒng)一的web標(biāo)準(zhǔn))。
能夠充分整合移動(dòng)設(shè)備上的各種功能:例如不需要依靠Flash或是W3C的標(biāo)準(zhǔn),就能將攝像機(jī)和文件系統(tǒng)整合起來。能夠?yàn)閼?yīng)用程序創(chuàng)建一個(gè)圖標(biāo)而不是一個(gè)書簽。
PhoneGap以及其他類似的開發(fā)工具的缺點(diǎn)是:它將原來的Web應(yīng)用程序和本地應(yīng)用程序的概念區(qū)分開了。而一個(gè)理想的情況應(yīng)該是:我們可以將本地應(yīng)用程序也當(dāng)做是一個(gè)標(biāo)準(zhǔn)的離線Web應(yīng)用程序來處理。
Martin Fowler指出了跨平臺(tái)開發(fā)中的一些困難:例如不同設(shè)備間的UI控制存在差異(Android的按鍵和iOS的按鍵),用戶體驗(yàn),以及安全模型。他表示將Web應(yīng)用程序部署成本地應(yīng)用程序是解決上述困難的方法之一,而這正是PhoneGap所做的工作。
注:作者Giorgio Sironi是一個(gè)自由職業(yè)的Web開發(fā)人員,以優(yōu)異的成績(jī)獲得計(jì)算機(jī)工程學(xué)士學(xué)位。作者參與了許多開源項(xiàng)目,如Zend Framework以及Doctrine。作者認(rèn)為編程是世界上最艱難而又最美麗的工作之一。Giorgio 是DZone社區(qū)的領(lǐng)導(dǎo),發(fā)布了374篇文章。)