PhoneGap 與 Cordova 的實際差異

談起跨平台手機 Apps,PhoneGap 應該算是最為人熟識的 Framework。
那 Cordova 又是啥東東?

原來是 Adobe 在 2011 年從一家小型公司手上收購了 PhoneGap。
然後又把它的 Source Code 捐獻了給 Apache 基金會成為 OSS。
但 Adobe 又保留了 PhoneGap Build 這個服務自己獨有。

從此於是乎兩者的關係曖昧不清…按照官方的說法 PhoneGap 是 Cordova 的一個 distribution。

PhoneGap is a distribution of Apache Cordova. You can think of Apache Cordova as the engine that powers PhoneGap, similar to how WebKit is the engine that powers Chrome or Safari.

除了 PhoneGap Build 之外有甚麼差異?

看似沒有,但實際用的時候其實不少,光一個 PhoneGap Build的差異就夠大了。
簡直可以用陷阱處處來形容!

對開發者而然,最麻煩的是兩者的 Documents 和 Syntax 都經常糾纏不清。
而混合了的結果就是莫明奇妙的出錯、設定無作用。
更慘的是兩者都經歷了 N 個版本,很多網上找到的教學都 Outdate 了。

(本文編寫時 PhoneGap 和 Cordova 版本均為 3.4.0)

檔案結構差異:

1. config.xml 位置

phonegap: /www/config.xml
cordova: /config.xml

這造成很多 PhoneGap 的 hooks 在 Cordova 下無法直接使用。

2. config.xml 內容

  • phonegap local build 會無視所有以 <gap:> 為 namespace 的 tag
  • cordova 遇到 <gap:> 為 namespace 的 tag 更會出現 Error
    (以上包括 <gap:splash><gap:plugin>
    因此 splash 需要自行複製檔案,而 plugin 需要用 cordova plugin add 加入)
  • phonegap local build 及 cordova 均無視所有 <icon> tag,嘗試使用它們只會徒勞無功,浪費時間 (I am not alone…)
    (icon 需要直接按平台原生方法直接修改 /platform/ 下的檔案,或使用 Hook 解決)
  • phonegap 生成的 Project 有比較多預設的 preference,這些選項三者都可以正常使用

Plugin 差異

  • phonegap remote build 和 local build 的 plugin 是分開的
  • 使用 phonegap plugin add 加入的 plugin 無法在 remote build 使用,反之亦然
  • PhoneGap Build 必需修改config.xml 加入Plugin,例如

Add the following to your config.xml to use version 1.4.1 of this plugin (recommended)::

<gap:plugin name="nl.x-services.plugins.flashlight" version="1.4.1" />
  • cordova/phonegap local build 則使用 plugin add 直接由 repository 下載

CLI 操作差異:

– phonegap 專用指令:

phonegap remote *

– cordova 專用指令:

cordova platform add [platform]

只有 cordova 可以執行 platform add
phonegap 需要直接執行 phonegap build [platform],
執行後會自動加入 Platform 但 platform update [platform] 卻可以共通

cordova prepare
cordova compile

只有 cordova 有 prepare 及 compile 指令
而 phonegap 於 phonegap build 時自動執行 prepare 及 compile

cordova plugin search

只有codrova 有 plugin search 指令,用來搜尋 plugins.cordova.io 上的 Plugin,
但數量很少,沒甚麼大用途的,http://plugreg.com/ 好用多了。

結論

我的理解,PhoneGap 是 Cordova 的一個 Addon。
這 Addon 只加入了 Remote Build 功能。
而Remote Build 和 Local Build 的設定不能共通。

使用 PhoneGap Build 的 Project,如果需要 Local Build 的話,
Icon/Splash 需要手動處理,否則不起作用。
Plugin 必需分別將 Plugin 加入 remote 及 local,否則不起作用。
CLI 需要用 phonegap build,不能用 cordova build 否則會出錯。

而因為 <gap:> 的 namespace,
使用 PhoneGap 建立的 Project,無法使用 Cordova Build;
使用 Cordova 建立的 Project,可以使用 PhoneGap Build。

最後結論是…煩死了,我還是直接只用 Cordova 好了
(除非沒有 Mac 機下需要 Compile iOS App 吧)

5 Replies to “PhoneGap 與 Cordova 的實際差異”

  1. 謝謝分享!
    最近企業在使用 EZoApp 這套開發工具,
    運用了 JQueryMobile 和 Cordova 的技術,
    同時也是利用 HTML+JS+CSS 來開發,
    推薦給您試用看看~ ^_^

    網站:http://www.ezoui.com/app/
    工具:http://jqmdesigner.appspot.com/designer.html
    影片:http://youtu.be/wzaubtL5az8

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.