ionic1實現熱更新以版本檢測更新安裝包的方法

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下全部的文件一塊兒拷貝到遠程服務器目錄;服務器

 熱更新的流程解析:網絡

  1. app啓動
  2. 從服務器請求chcp.json文件(會覆蓋本地chcp.json文件)。併發

  3. 服務器返回chcp.json文件與app裏的chcp.json文件作對比,判斷兩個文件中的release時間。app

  4. 若是服務器chcp.json文件的release時間大於app裏chcp.json的release時間(說明新的資源)ionic

  5. 若是有新的資源,再次發送一個請求,請求服務器的chcp.manifest文件(會覆蓋本地chcp.json文件)。

  6. 服務器返回chcp.manifest文件與app裏的chcp.manifest文件內容作對比。

  7. 若是有不同的hash值。

  8. 對服務器請求新的資源。

  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

插入的位置在:

異常緣由:

  • 這個異常的意思是對資源合併發生錯誤,那就是我使用的圖片資源有問題,我使用的圖片是能在android環境自適應展現的.9.png格式,在Eclipse上使用是能經過編譯的,可是爲何在android studio上就不能呢?
  • 原來,android studio中的資源文件命名是不能帶有數字的,由於會與R類的資源ID起衝突,因此編譯就發生了錯誤。

解決方法:

       方式一:只需從新命名圖片便可,在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){}                         }  };

相關文章
相關標籤/搜索