Markdown版本筆記 | 個人GitHub首頁 | 個人博客 | 個人微信 | 個人郵箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
混合開發 Hybird Cordova PhoneGap web 跨平臺 MDjavascript
官網
中文網
W3C
cordova-android html
關鍵詞:java
Cordova包裝你的HTML/JavaScript app到原生app容器[container]中,可讓你訪問每一個平臺設備的功能。這些功能經過統一的[unified] JavaScript API 提供,讓你輕鬆的編寫一組代碼運行在幾乎市面上的全部手機和平板上,並能夠發佈到相應的app商城中。node
Apache Cordova是一個開源移動開發框架,它容許您使用標準的Web技術,如HTML5,CSS3和JavaScript進行跨平臺[cross-platform]開發。應用程序在針對每一個平臺的包裝[wrappers]內執行,並依賴符合標準的API綁定來訪問每一個設備的功能[capabilities],如傳感器,數據,網絡狀態等。android
適用Apache Cordova
的人羣:ios
web App
將其分發[distribution]到各個應用商店門戶。Cordova 是用於使用HTML,CSS和JS
構建移動應用
的平臺。咱們能夠認爲Cordova是一個容器
,用於將咱們的網絡應用程序
與本機移動功能
鏈接。默認狀況下,Web應用程序不能使用本機移動功能。這就是Cordova進來的地方。它爲網絡應用和移動設備之間的鏈接提供了橋樑
。 經過使用cordova,咱們可使混合移動應用程序,可使用攝像頭,地理位置,文件系統和其餘本地移動功能。 git
適用人羣:但願瞭解移動開發的HTML,CSS和JavaScript開發人員
。
學習前提:須要熟悉HTML,CSS和JavaScript
。 程序員
時下流行的移動Web應用可分爲三種:原生應用、Web應用和混合型應用。github
Cordova 就是混合型應用。web
優勢:
缺點(就一個字:卡):
你須要瞭解的:
phonegap
和cordova
的區別:他們之間沒有區別,在被收購以前叫phonegap
,被收購後叫cordova
phonegap
能作什麼:它是一個橋樑,能讓網頁能夠調用手機的硬件,沒有別的用處了。phonegap
作不了只能原生作:網頁上用JS調用phonegap
,phonegap
調用原生代碼,原生代碼調用手機硬件,因此理論上說,原生能夠作的phonegap
均可以作。能夠用原生的寫插件,用phonegap
調用。總結:其實phonegap不是想象中的那麼好用,作一些簡單的增刪改查APP仍是能夠的,若是你的公司剛起步或者不想請高價開發人員,而APP又比較簡單,那你就選它吧。
cordova應用程序有幾個組件。下圖顯示了cordova應用程序體系結構的high-level視圖。
從圖中,咱們能夠看到它提供了Web APP、WebView、Cordova Plugins
。
Web APP
這是存放[resides]應用程序代碼的部分。應用程序的實現是經過web頁面,默認的本地文件名稱是index.html
,這個本地文件引用 CSS,JavaScript,images,media files和其餘運行須要的資源。應用程序執行在原生應用包裝的WebView中,這個原生應用是你分發到 app stores 中的。
此容器有一個很是關鍵的config.xml
文件,該文件提供有關應用程序的信息,並指定影響其工做的參數,例如它是否響應方向轉換[orientation shifts]。
WebView
Cordova啓用的WebView能夠給應用提供完整用戶訪問界面[entire user interface]。在一些平臺中,他也能夠做爲一個組件給大的、混合[hybrid]應用,這些應用混合[mixes] Webview 和原生的應用組件。
Cordova Plugins
插件是Cordova生態[ecosystem]的重要組成部分。他提供了Cordova和原生組件相互通訊的接口,並綁定到了標準的設備API上,這使你可以經過JavaScript調用原生代碼。
Apache Cordova項目維護了一組名爲Core Plugins
的插件。這些核心插件爲您的應用程序提供訪問設備功能,如電池,相機,聯繫人等。
除了核心插件以外,還有一些第三方插件能夠提供額外的綁定(不必定全部平臺上都提供的這些功能)。您可使用插件搜索或npm搜索Cordova插件。您還能夠開發本身的插件,例如,可能須要插件才能在Cordova和自定義native組件之間進行通訊。
注意:建立Cordova項目時,它沒有任何插件。這是新的默認行爲。您須要的任何插件,甚至是核心插件,都必須明確添加。
注意:Cordova不提供任何UI widgets
或MV*
框架。Cordova僅提供能夠執行的 runtime。若是您但願使用UI widgets
或MV*
框架,則須要選擇它們並將它們包含在您的應用程序中。
iOS:【webView:shouldStartLoadWithRequest
:navigationType
:】
Android:【public void addJavascriptInterface
(Object object, String name)】
第一個是 iOS 上 UIWebView 將要開始跳轉地址的時候被調用,進而根據傳入的地址做出反應。
第二個是 Android 上用於使一個 Java 對象能夠在 JS 中被訪問,並調用其方法
。
這就開啓了兩個平臺上 JS 和原生代碼之間的溝通窗口
,這就是原理。
Cordova
在這個基礎上構建了完善的一套體系,讓咱們能夠以一種簡單標準的流程寫 Hybird
應用,它來負責這個 JS 與原生代碼的溝通工做。
到這看得出,其實原生代碼是避不開的
,想要利用系統的各項功能必需要寫對應不一樣系統支持的不一樣語言的原生代碼。但有不少寫 Cordova
的程序員不懂這些也能寫出東西來,靠的就是豐富的插件
。
隨便找一個 Cordova
插件,目錄結構打開,大體是這樣:
xxx@xxx:~/.../cordova-plugin-device > tree ├── README.md ├── package.json ├── plugin.xml ├── src │ ├── android │ │ └── Device.java │ ├── ios │ │ ├── CDVDevice.h │ │ └── CDVDevice.m │ ├── ... │ └── wp │ └── Device.cs └── www └── device.js
看到 src
文件夾底下的 ios、android、wp
這些文件夾了麼,裏面裝的就是各個平臺上的原生代碼
。用打包工具 build 的時候,就會對應的幫你複製到各個平臺的項目文件夾去,並作好配置。
好比我寫一個調用攝像頭拍照片的插件,支持 android 與 iOS 兩個平臺,我就要針對這兩個平臺編寫兩份完成一樣功能的原生代碼
,而後給一個統一的 JS 接口
,由 Cordova 把這個接口暴露給寫 Cordova 應用的人。他們就能夠只用 JS 完成我寫的插件承諾可以作到的功能,也就是拍一張照片。
也就是說 Cordova 寫的應用理論上能夠作到任何原生應用能作到的功能
,而不是不少人誤解的「侷限很大」,確實是有侷限,但不是侷限在可能性
上。
雖然只使用用上面提到的兩個接口也可讓你作到這裏說的使用 JS 調用原平生臺功能
,但 Cordova 把這個過程簡化、標準化,甚至生態化了。豐富的插件
、活躍的社區還有詳盡的文檔,這些都極大方便了 Hybird
應用的開發過程。就好像只用 1010
能夠構建整個互聯網,但咱們仍然須要操做系統
同樣。
PhoneGap是一個採用HTML,CSS和JavaScript
的技術,建立移動跨平臺
移動應用程序的快速開發平臺。它使開發者可以在網頁中調用IOS,Android
等智能手機的核心功能——包括地理定位,加速器,聯繫人,聲音和振動等,此外PhoneGap擁有豐富的插件
能夠調用。
PhoneGap本來由Nitobi公司開發,如今由Adobe擁有。
PhoneGap目前支持的操做系統包含:蘋果的iOS,谷歌的Android,RIM的Blackberry,惠普的WebOS,微軟的Windows Phone,塞班公司的Symbian以及三星的bada。
Cordova是PhoneGap
貢獻給Apache
後的開源項目,是從PhoneGap中抽離出的核心代碼,是驅動PhoneGap的核心引擎。有點相似Webkit
和Google Chrome
的關係。
淵源就是:早在2011年10月
,Adobe
收購了Nitobi Software
和它的PhoneGap
產品,而後宣佈這個移動Web開發框架
將會繼續開源,並把它提交到Apache Incubator
,以便徹底接受Apache Software Foundation
的管治。固然,因爲Adobe擁有了PhoneGap商標,因此開源組織的這個PhoneGap v2.0
版產品就改名爲Apache Cordova
。
Cordova名字的由來:
PhoneGap 由一個叫Nitobi
的公司發起 ,曾經更名爲Callback
,接着又更名爲Cordova
,由於Nitobi
的辦公地點曾設在在一條叫Cordova
的街道。
就目前來看,cordova
是一個移動應用開發框架
,你基於這個東西能夠用網頁代碼作出APP。
Phonegap Build
是一個在線打包工具
,你把使用cordova
寫好的項目給Phonegap Build,Phonegap Build 就會在線打包成App。
目前你們所說的Phonegap
,其實指的都是cordova
,而那個真正被Adobe
收購了的Phonegap
,如今是Phonegap Build
和 cordova
的合體。
簡單來講,就是看你需不須要Phonegap Build
的功能,或者說需不須要在線打包,須要就是用Phonegap
,不然直接使用cordova
便可。
PhoneGap build
is a Build Service allows you to build and package you app in cloud。
JDK
打開cmd,輸入java -version
和javac -version
,能夠看到打印的Java和Javac版本信息。若是沒有,請配置java環境變量。
Git
打開cmd,輸入git --version
,能夠看到打印的Git版本信息。若是沒有,請配置Git環境變量。
adb
打開cmd,輸入adb --version
,能夠看到打印的adb版本信息。若是沒有,請配置adb環境變量。
Node.js
打開cmd,輸入node -v
和npm -v
,能夠看到打印的Node和npm版本信息。若是沒有,請配置Node環境變量。
下載、安裝
新版的Node.js已自帶npm,安裝Node.js時會一塊兒安裝,npm的做用就是對Node.js依賴的包進行管理,也能夠理解爲用來安裝/卸載Node.js須要裝的東西。
檢測環境是否成功
設置默認路徑
默認在執行相似:npm install express [-g]
的安裝語句時,會將安裝的模塊安裝到【C:\Users\用戶名\AppData\Roaming\npm】路徑中,
修改安裝模塊所在路徑和緩存路徑
npm config set prefix "C:\_Web\node.js\node_global" npm config set cache "C:\_Web\node.js\node_cache"
設置系統變量和用戶變量
在【系統變量】下新建【NODE_PATH】,輸入【C:_Web\node.js\node_global\node_modules】,將【用戶變量】下的【Path】的【C:\Users\baiqi\AppData\Roaming\npm】修改成【C:_Web\node.js\node_global】
配置完後,安裝個module測試下,咱們就安裝最經常使用的express模塊:【npm install express -g】
-g是全局安裝的意思,安裝後發現express模塊安裝在剛纔配置的全局模塊路徑【C:_Web\node.js\node_global\node_modules\express】中,若是不加 參數 -g ,則會安裝在當前路徑下。
全局安裝 Cordova
npm install cordova –g
中途若會出現「Error: shasum check failed for」 錯誤,多數是由於網絡問題致使下載插件包失敗,能夠重試幾回。
經過 cd/d
命令定位到要建立的cordova項目所在的目錄,執行如下命令:cordova create 文件夾名 包名 應用名
,例如:cordova create hello com.bq.test helloWorld
目錄簡介:
index.html
文件。經過 cd
命令定位到項目目錄,執行cordova platforms ls
命令檢查你電腦支持的平臺。
若是包含你要添加的平臺,則能夠經過執行cordova platform add android
命令添加須要的平臺。
能夠經過輸入cordova platforms rm android
移除對相應平臺的支持。
cordova platforms add android@6.0
先到這裏去 搜索插件,記錄下插件的名稱
而後添加插件:cordova plugin add cordova-plugin-camera
刪除插件:cordova plugin rm cordova-plugin-camera
,使用rm和remove均可以
cordova plugin list
這裏的列表應該與文件目錄的列表相同:
一個簡單的主頁是這樣的:
<!DOCTYPE html> <html> <head> <title>Capture Photo</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <script type="text/javascript" charset="utf-8" src="cordova.js"></script> <script type="text/javascript" charset="utf-8"> var destinationType; document.addEventListener("deviceready", onDeviceReady, false); //Cordova加載完成會觸發 function onDeviceReady() { destinationType = navigator.camera.DestinationType; } //拍照 function getPhoto() { //拍照並獲取Base64編碼的圖像(quality : 存儲圖像的質量,範圍是[0,100]) navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: destinationType.DATA_URL }); } //拍照成功 function onPhotoDataSuccess(imageData) { console.log(imageData); var image = document.getElementById('image'); image.style.display = 'block'; image.src = "data:image/jpeg;base64," + imageData; } //拍照失敗 function onFail(message) { alert('拍照失敗: ' + message); } </script> </head> <body style="margin:0;padding:0"> <button style="font-size:23px;" onclick="getPhoto();">getPhoto</button> <br> <img style="display:none;width:100%;height:100%;" id="image" src="" /> </body> </html>
裏面有一個按鈕和一個顯示圖片的控件,點擊按鈕後能夠經過相機拍照並獲取圖片,在返回時將圖片顯示在控件上。
在命令窗口執行編譯調指定平臺的應用:cordova build android
完成後就在 \platforms\android\app\build\outputs\apk\debug
目錄下生成了咱們須要的Android安裝包。
經常使用的幾個命令:
咱們發現,經過 cordova 建立的Android項目和咱們經過AndroidStudio建立的項目基本同樣,好比文件目錄結構:
咱們甚至能夠直接使用 AndroidStudio 打開並構建此項目。
固然因爲一些配置的緣由可能沒法直接運行,可是稍微改一點點東西就能夠運行了。我就改了兩個地方:
- 刪除 \platforms\android\app\src\main\res\xml
- 按照AndroidStudio的提示更新了gradle版本
這個項目我放在了這個GitHub倉庫 中。
public class MainActivity extends CordovaActivity public class CordovaActivity extends Activity protected CordovaWebView appView = new CordovaWebViewImpl(makeWebViewEngine()); onCreate() -> loadUrl(launchUrl); onDestroy() -> appView.handleDestroy(); setContentView(appView.getView());
<?xml version='1.0' encoding='utf-8'?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bq.test"【包名】 android:hardwareAccelerated="true"【硬件加速】 android:versionCode="10000"【版本號,版本碼】 android:versionName="1.0.0"> 【支持的屏幕】 <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true"/> 【權限:網絡、寫SD卡】 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 【支持的SDK版本】 <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27"/> 【application】 <application android:hardwareAccelerated="true"【硬件加速】 android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true"> 【入口activity】 <activity android:name="MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize"> <intent-filter android:label="@string/launcher_name"> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> 【適配7.0的文件權限】 <provider android:name="org.apache.cordova.camera.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/camera_provider_paths"/> </provider> </application> </manifest>
其配置的 FileProvider
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths>
settings.gradle:
include ":" include ":CordovaLib" include ":app"
app 模塊的 build.gradle 的部分代碼:
apply plugin: 'com.android.application' compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } dependencies { implementation fileTree(dir: 'libs', include: '*.jar') implementation(project(path: ":CordovaLib")) compile "com.android.support:support-v4:24.1.1+" }
CordovaLib 的 build.gradle 的部分代碼:
apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray'
至此,經過 Cordova 的一個完整的演示成功完成了。
2018-10-15