ionic app 安卓版自动更新

准备工作

ngcordova 插件:

  1. 文件管理插件:cordova plugin add cordova-plugin-file
  2. 文件传输插件:cordova plugin add cordova-plugin-file-transfer
  3. 文件打开插件:cordova plugin add https://github.com/pwlin/cordova-plugin-file-opener2.git
  4. app版本获取插件:cordova plugin add https://github.com/whiteoctober/cordova-plugin-app-version.git
获取服务器上的版本号

得到服务器上的apk的versionCode后,使用$cordovaAppVersion获取当前运行的apk的versionCode后,将两者进行比较。

$http.get(url)
   .then(function (success) {
     var data = success.data;
     var serverCode = data.versionCode;
     $cordovaAppVersion.getVersionCode()
       .then(function (version) {
         // 返回服务器上的versionCode与本地versionCode是否一致
         deferred.resolve(version != serverCode);
       }, false)
   }, function (error) {
     deferred.reject(error);
   });
下载apk,并更新安装

提示是否更新

var confirmPopup = $ionicPopup.confirm({
    title: '<strong>提示</strong>',
     template: '发现新版本,是否更新?',
     okText: '确认',
     cancelText: '取消'
   });

   confirmPopup
     .then(function (res) {
       if (res) {
         Download.updateAPK();
       }
     });
 }

文件下载服务,我的安卓项目的包路径中包含了数字,不知道是不是因为这个原因,将apk下载到 cordova.file.dataDirectory下,一运行就报:”解析软件包时出现问题”,后面,将apk下载至其他目录成功升级。

.factory('Download', [
    '$cordovaFile',
    '$cordovaFileTransfer',
    '$cordovaFileOpener2',
    '$q',
    'Util',
    '$timeout',
    'Android_MIME_MapTable',
    'SystemConstant',
    '$ionicLoading',
    function ($cordovaFile, $cordovaFileTransfer, $cordovaFileOpener2, $q, Util, $timeout, Android_MIME_MapTable, SystemConstant, $ionicLoading) {

      // 下载目录
      var downloadPath;

      return {
        /**
         * 初始化app的下载目录
         */
        initDownloadDirectory: function () {
          /**
           * cordova.file.dataDirectory 不同平台对应位置如下
           *  android:'data/data/<app-id>/files/'
           *  IOS:'/var/mobile/Applications/<UUID>/Library/NoCloud/'
           */

          /**
           * 因android平台,apk类型的文件放到cordova.file.dataDirectory下,将无法正常安装
           * 因此,针对不同平台,使用不同的下载目录
           */
          if (ionic.Platform.isAndroid()) {
            // 初始化android平台的下载目录
            downloadPath = cordova.file.externalRootDirectory + ''app_download_path'';

            this.createDir(cordova.file.externalRootDirectory, 'app_download_path')
              .then(function (success) {
                downloadPath = success.nativeURL;
              }, false);
          } else {
            // 初始化IOS平台的下载目录
            downloadPath = cordova.file.dataDirectory + 'app_download_path';

            this.createDir(cordova.file.dataDirectory, 'app_download_path')
              .then(function (success) {
                downloadPath = success.nativeURL;
              }, false);
          }
        },

        /**
         * 创建目录
         * @param path 目录
         * @param directory 目录名称
         */
        createDir: function (path, directory) {
          var deferred = $q.defer();

          $cordovaFile.createDir(path, directory, false)
            .then(function (success) {
              deferred.resolve(success);
              console.log("目录创建成功!" + angular.toJson(success));
            }, function (error) {
              deferred.reject(error);
              console.log("目录创建失败!" + angular.toJson(error));
            });

          return deferred.promise;
        },

        /**
         * 文件下载
         * @param url 资源定位
         * @param targetPath 文件存储位置
         * @returns {Promise}
         */
        download: function (url, targetPath) {
          var deferred = $q.defer();

          // 允许所有安全证书
          var trustAllHosts = true;
          // 选项
          var options = {};

          $ionicLoading.show({template: "已经下载0%"});
          $cordovaFileTransfer.download(url, targetPath, options, trustAllHosts)
            .then(function (success) {
              $ionicLoading.hide();
              deferred.resolve(success);
            }, function (error) {
              deferred.reject(error);
            }, function (progress) {
              $timeout(function () {
                var downloadProgress = (progress.loaded / progress.total) * 100;
                $ionicLoading.show({template: "已经下载" + Math.floor(downloadProgress) + "%"});

                if (downloadProgress > 99) {
                  $ionicLoading.hide();
                }
              });
            });

          return deferred.promise;
        },

        /**
         * 更新apk
         */
        updateAPK: function () {
          var deferred = $q.defer();

          var url = "http://yourServceAddress/your.apk";
          var targetPath = downloadPath + "/" + 'your.apk';

          this.download(url, targetPath)
            .then(function () {
              // 使用插件打开apk文件
              $cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive')
                .then(function (success) {
                  console.log(angular.toJson(success));

                  deferred.resolve(success);
                }, function (error) {
                  console.log(angular.toJson(error));

                  deferred.reject(error);
                });
            }, function (error) {
              deferred.reject(error);
            });
        }

      }
    }])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值