关于ionic 开发自动更新app的实现

时间:2022-06-17 18:29:09

关于app的自动更新通常采用的是 重新下载新的apk重新安装来覆盖原有的app

思路通常是

1.获取当前的版本号oldVersionName

2.向服务器端请求最新的版本号newVersoionName

3.前端对比oldVersionNamenewVersionName的值 如果相同就不不做更新处理,否则就提示有更新

 

Ionic中有2种实现方式一种是常规的实现更新如上面所述,第二种是热更新www文件

这里我们才用的是第1种方式。

实现代码详解:

这里我们需要的cordova的插件来实现 通常我们创建项目的时候需要提前将插件安装好不然安装插件的时候会将之前写好的代码覆盖或者说会重新build项目。这里要切记

下面是要安装的插件

· cordova plugin add cordova-plugin-device

· cordova plugin add cordova-plugin-console

· cordova plugin add cordova-plugin-whitelist

· cordova plugin add cordova-plugin-splashscreen

· cordova plugin add cordova-plugin-statusbar

· cordova plugin add ionic-plugin-keyboard

· cordova plugin add cordova-plugin-app-version

· 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

· 红色字是必须要的插件 蓝色字是可要可不要的插件  黑色字的可能是系统默认安装的(ionic的版本不同安装自带的插件也不同)不会影响功能的正常使用。

· 下面正式讲解代码:

//自动更新开始

$scope.versionName =null;//定义版本号

//向后天请求的newversionde 值

var myurl= _HTTP_ADDRESS+'/infoservice/menu/getVersion.do';

    $http.get(myurl)

    .success(function(data){

//  {"versionName":"10007"}测试用得 没有用可以删掉

//data是请求的json数据 可以根据情况去处理,这里只是作为例子

            $scope.versionName=data.versionName;

            //这就是自动更新的重点方法了

            checkUpdate();

    });

    // Android升级

    function checkUpdate() {

    //更新的方法和函数document.addEventListener("deviceready",function(){})

//    里面不然方法不会执行会提示你function没有被定义

      document.addEventListener("deviceready",function () {

        //获取网络的信息是通过cordova的插件来实现的  你也可以把他写到服务里面

        var type= navigator.connection.type;

        varAppVersionCode =$scope.versionName;// 获取的服务器版本

        //获取本地APP版本

        //cordova.getAppVersion.getVersionNumber().then(function (})是固定写法   看一查阅github的api

        cordova.getAppVersion.getVersionNumber().then(function(version) {

          // 0.0.1 => 00001 => 1

          //将版本号转化成固定的格式  我们要避免使用.这样的符号

          //转换过后的本地版本号nowVersionNum

          var nowVersionNum= parseInt(version.toString().replace(newRegExp(/(\.)/g),'0'));

          // 10000

          //newVersionNum获取的服务器版本

          var newVersionNum= parseInt(AppVersionCode);

 

          if(newVersionNum >nowVersionNum) {

          //判断网络信息我们去执行相应的操作,这里操作简单我就不做注解了

            if (type=== 'wifi') {

              $ionicPopup.confirm({

                title: '版本升级',

                template: '发现新版本',

                cancelText: '取消',

                okText: '升级'

              }).then(function(res) {

                if(res) {

                  UpdateForAndroid();

                }

              });

            } else{

              $ionicPopup.confirm({

                title: '建议您在WIFI条件下进行升级,是否确认升级?',

                template: '发现新版本',

                cancelText: '取消',

                okText: '升级'

              }).then(function(res) {

                if(res) {

                  UpdateForAndroid();

                }

              });

            }

          }

        });

      }, false);

    }

    //这个方法就是核心方法了    让你能实现版本的更新

    function UpdateForAndroid() {

      varsource ='http://116.113.33.52:8989/slxx/html/p/p_136/20160523165724724561817/19661463993859750.apk';// 下载地址

      vartarget ="/sdcard/Download/ionic.apk";

      vartrustAllHosts =true;

      varoptions ={};

      //FileTransfer这个类是cordova插件的方法,要使用文件下载new一个FileTransfer对象调用他的方法就好了

      var fileTransfer= new FileTransfer();

      /**这是官方给出的api 参数的解释  因为比较好懂这里需要注意下的是trustAllHosts参数

       *trustAllHosts这个参数决定了 你能否下载当trustAllHosts=false时你的下载的链接必须有安全凭证,

       * trustAllHosts=true的时候 你可以跳过安全凭证

   * Downloads a file form a given URL and saves it to the specified directory.

       * @param source {String}          URL of the server to receive the file

       * @param target {String}         Full path of the file on the device

       * @param successCallback (Function}  Callback to be invoked when upload has completed

       * @param errorCallback {Function}    Callback to be invoked upon error

       * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false

       * @param options {FileDownloadOptions} Optional parameters such as headers

       */

      function successCallback(entry){

//   当下载成以后同过这个cordova方法你将打开你下载的最新app 固定格式 不做讲解 如果想知道cordova.plugins.fileOpener2插件的其他用法,可以看官方给的api

       cordova.plugins.fileOpener2.open(

      target,

      'application/vnd.android.package-archive'

       );

      $ionicLoading.hide();

      }

      functionerrorCallback(error){

     //当apk下载失败做的操作

     $ionicLoading.show({

            template: "下载失败"

          });

          $timeout(function() {

              $ionicLoading.hide()

            }, 2000);

      }

      //这个方法就是执行下载apk的方法 参数一定要写对 上面有对应的参数 自行查看 就不做讲解了

      fileTransfer.download(source, target, successCallback, errorCallback, trustAllHosts, options);

      //onprogress 是fileTransfer的属性   他是通过回调函数来更新下载进度的

      fileTransfer.onprogress= function(progressEvent) {

        if(progressEvent.lengthComputable) {

        $ionicLoading.show({

              template: "已经下载:" +Math.floor((progressEvent.loaded/ progressEvent.total)*100)+ "%"

            });

        }}

    }

  

·  //自动更结束

这段代码是使用在controller里面的也可以根据自己的需要去写成服务和指令。就不在细说了