1.須要下載熱更新插件:插件名稱是cordova-hot-code-pushjava
首先打開cli,執行命令 npm install -g cordova-hot-code-push-cli
此功能主要是爲了生成兩個配置文件chcp.json和chcp.manifest,用於檢測更新
2.安裝更新插件:android
打開項目路徑,打開cli,輸入
ionic plugin add cordova-hot-code-push-plugin
ionic plugin add cordova-hot-code-push-local-dev-addon
3.運行:web
cordova-hcp build 或 cordova build
此時www文件夾中會出現兩個文件,也就是上文說的chcp.json和chcp.manifest
chcp.json格式爲:
{
"autogenerated": true,
"content_url": "http://xxxxx.com", //更新遠程庫路徑
"update": "start", //更新模式 start:啓動更新 resume:後臺切換回來更新 now:web內容下載完畢即安裝更新
"release": "2017.12.16-11.29.38"
}
該文件在每次執行cordova-hcp build 都會更新,爲了避免用每次更改chcp.json的內容,能夠在項目根目錄下建立一個cordova-hcp.json文件:
{
"autogenerated": true,
"content_url": "http://xxxxx.com", //更新遠程庫路徑
"update": "start"
}
之後每次執行cordova-hcp build時,會將cordova-hcp.json的內容更新到chcp.json中,省去每次都要修改的麻煩;
chcp.manifest 爲文件的名稱與hash值的集合,用於檢測哪些文件須要更新
此時在項目根目錄下會生成一個.chcpenv的文件,此文件用戶配置遠程服務器,內容以下:
{
"content_url": "http://xxxxx.com", //用於獲取文件
"config_url": "http://xxxxx.com/chcp.json" //用於訪問遠程服務器配置文件
}
修改項目的config.xml文件,添加以下內容,指定客服端須要從哪請求最新的chcp.json配置文件,這裏咱們指定爲www目錄文件提交的服務器地址:npm
<chcp> <local-development enabled="true"/> <config-file url="192.168.1.110/Code/1.0.1/www/chcp.json" />
</chcp>
4. 打包APP,而後更改www目錄下的任何一個文件,而後cli執行cordova-hcp build,上面的兩個配置文件會同時更新;json
5.將www下全部的文件一塊兒拷貝到遠程服務器目錄;服務器
熱更新的流程解析:網絡
從服務器請求chcp.json文件(會覆蓋本地chcp.json文件)。併發
服務器返回chcp.json文件與app裏的chcp.json文件作對比,判斷兩個文件中的release時間。app
若是服務器chcp.json文件的release時間大於app裏chcp.json的release時間(說明新的資源)ionic
若是有新的資源,再次發送一個請求,請求服務器的chcp.manifest文件(會覆蓋本地chcp.json文件)。
服務器返回chcp.manifest文件與app裏的chcp.manifest文件內容作對比。
若是有不同的hash值。
對服務器請求新的資源。
9. 請求成功的資源將覆蓋本地資源。
1. 可能會打開兩次才能看到效果;第一次啓動的時候檢查更新並下載更新,第二次啓動的時候就會使用更新的版本。
2.報錯:
運行下: cordova-hcp server; .chcpenv文件就出來了;
3.我用ionic build android -- --ant時報錯,以下圖:
怎麼解決,,,?????????????
該報錯通常是爲環境變量中設置了java的jdk或adt引發的,,須要把JAVA_HOME ,CATALINA_HOME 等環境變量先去掉;
而後用cordova build android -- --ant打包:
對於已上兩種狀況是加了 --ant 的狀況報錯,不知道爲何!!!!!!!!
而後用cordova build android打包: 也報錯以下:
這個問題找到緣由了:是由於項目下的這個文件resources,裏面存放的是APP的logo圖片和啓動圖片;我用ionic resources -icon 、ionic resources --splash
來生層的不一樣尺寸的圖標; 當我把這些圖片換成官網模板中的圖片的時候就打包成功了!
解決方法:添加平臺後build如下:在D:..\..\..\platforms\android文件夾找到 build.gradle 文件以後加入下面代碼:
aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false
插入的位置在:
異常緣由:
解決方法:
方式一:只需從新命名圖片便可,在Make Project一下編譯就能經過了;
方式二:咱們能夠用代碼去除掉android studio對png格式文件的檢測,這樣系統就不會檢測png格式的資源文件了。
找到app->build.gradle文件並打開,在buildToolsVersion屬性下添加以下代碼:
aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false
------------------------------------------------------------------------------------------------------------------------------------------------------
(這個轉載的)
cordova plugin add cordova-plugin-app-version 獲取APP版本;
cordova plugin add cordova-plugin-file 文件系統;
cordova plugin add cordova-plugin-file-transfer 文件傳輸系統;
cordova plugin add cordova-plugin-file-opener2 文件打開系統;
cordova plugin add cordova-plugin-network-information 網絡狀況檢測;
app 外殼更新----------------------
經過上面的方式,咱們已經可以實現www目錄下的文件有變更時,直接從服務器上下載最新的代碼,但這種方式只限於咱們沒有對app外殼進行更新的狀況下使用,當咱們對外殼進行了更新時,咱們應該提示用戶升級app,好比咱們增長了某個插件時。要實現app外殼更新,咱們須要作以下操做:
1.修改咱們項目的config.xml,在原有配置上增長native-interface屬性,告訴cordova-hot-code-push插件,咱們的app內核版本號,修改後的配置以下:
<chcp> <native-interface version="3"/> <config-file url="http://hotcode.example.com/chcp.json"/> </chcp>
2.修改cordova-hcp.json文件,增長min_native_interface屬性,cordova-hcp build
後,chcp.json將會增長min_native_interface屬性。
{ "autogenerated": true, "content_url": "http://hotcode.example.com", "update": "start" "min_native_interface": 3 }
此屬性將與config.xml中的native-interface進行匹配,若是發現二者不一樣時,將會觸發相應的事件,好比,手機端app中config.xml的native-interface值比服務器上的chcp.json文件中的min_native_interface值小時,將會觸發’chcp_updateLoadFailed’事件,同時,錯誤代碼爲:chcp.error.APPLICATION_BUILD_VERSION_TOO_LOW
var appUpdate = { initialize: function() { this.bindEvents(); }, bindEvents: function() { document.addEventListener('chcp_updateLoadFailed', this.onUpdateLoadError, false); }, onUpdateLoadError: function(eventData) { var error = eventData.detail.error; // 當檢測到外殼有更新 if (error && error.code == chcp.error.APPLICATION_BUILD_VERSION_TOO_LOW) { // 針對不一樣平臺進行相應更新操做 } } }; appUpdate.initialize();
--------------------------------------------------------------------------------------------------
在系統中進行版本的檢測更新:
//點擊檢測更新;
$scope.update=function(){
checkUpdate();
};
//獲取當前文件的版本號:
document.addEventListener('deviceready',function(){
cordova.getAppVersion.getVersionNumber().then(function (version){
//獲取當前app的版本號;
$scope.now_version=version;
});
},false);
//從服務器獲取新版本;
$http.get("http://192.168.1.112:3000/appVersion.json").success(function(version){
//新版本號;
$scope.newversionName=version.new_version;
});
//更新方法;
var checkUpdate=function(){
document.addEventListener('deviceready',function(){
//獲取網絡的信息;
var type = navigator.connection.type;
//服務器最新的版本號;
var AppVersionCode =$scope.newversionName;
//獲取本地的app版本號;
cordova.getAppVersion.getVersionNumber().then(function (version){
var nowVersionNum = parseInt(version.toString().replace(new RegExp(/(\.)/g), '0'));
var newVersionNum = parseInt(AppVersionCode.toString().replace(new RegExp(/(\.)/g), '0'));
alert(nowVersionNum);
alert(newVersionNum);
if(newVersionNum > nowVersionNum){
if (type === 'wifi') {
$CommonFactory.showConfirm(function(){UpdateForAndroid();},"版本升級","發現新版本","升級","取消");
}else{
$CommonFactory.showConfirm(function(){UpdateForAndroid();},"建議您在WIFI條件下進行升級,是否確認升級?","發現新版本","升級","取消");
}
}else{
$CommonFactory.showToast("你當前已是最新版本了!","short","center");
}
});
},false);
} var UpdateForAndroid=function(){ //下載地址;
var source="http://192.168.1.112:3000/qdbus8.14.apk"; var target="/sdcard/Download/ionic.apk"; var trustAllHosts = true; var options = {}; var fileTransfer = new FileTransfer(); function successCallback(entry){ cordova.plugins.fileOpener2.open(target, 'application/vnd.android.package-archive'); $ionicLoading.show({ template: "已經下載:100%" }); $timeout(function(){ $ionicLoading.hide(); },1000); } function errorCallback(error){ $ionicLoading.show({ template: "下載失敗" }); $timeout(function(){ $ionicLoading.hide(); }, 2000); } //這個方法就是執行下載apk的方法 參數必定要寫對 上面有對應的參數 自行查看 就不作講解了 fileTransfer.download(source, target, successCallback, errorCallback, trustAllHosts, options); $ionicLoading.show({ template: "已經下載:0%" }); fileTransfer.onprogress = function(progressEvent){ if (progressEvent.lengthComputable){} } };