ionic app 版本更新

本文介绍了在 Ionic 应用中如何实现版本更新检查和更新流程,包括从服务器获取版本号、比较版本、安装插件,以及解决Android 6.0及以上版本动态权限问题,确保更新过程的顺利进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:启动APP时检测是否有新版本需要更新,提示进行更新

解决思路:

1.从服务器获取版本号,与当前app版本的版本号进行比较,若不相同,则进行更新,相同直接跳过,进入登录界面

解决步骤:

① 安装好ionic开发环境,像JDK,SDK,nodejs...就不多说了,自己去百度

② 安装相关插件

版本信息:ionic plugin add cordova-plugin-app-version
文件管理:ionic plugin add cordova-plugin-file
文件传输:ionic plugin add cordova-plugin-file-transfer 
打开文件:ionic plugin add cordova-plugin-file-opener2

③ 在服务器端配置好版本号,拿到版本号,通过

 $cordovaAppVersion.getVersionNumber().then(function(version) {
alert(version);
}

方法获取到app版本号,与之进行比对

④ 从服务器下载新版app

    /**
     * url : 服务器下载路径
     * targetPath : 存储路径
     * trustHosts : 如果设置为true,接受所有安全证书
     * options : 可选参数
     * @type {string}
     */
    var url = "http://192.168.1.23:8080/app/android-debug.apk";
    var targetPath = "file:///mnt/sdcard/Download/android-debug.apk";
    var trustHosts = true;
    var options = {};

    // 从服务器下载
    $cordovaFileTransfer.download(url, targetPath, options, trustHosts).then(function (result) {

        // 下载完成
    }, function (err) {

        alert('下载失败');
    }, function (progress) {

        // progress进度
    });
⑤ 下载完成之后打开安装包,重新安装
$cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive').then(function () {
    
    ionic.Platform.exitApp();
}, function (err) {

    alert("安裝包打開失敗");
});

按正常来说这样就结束了对吧?但是忘了一个非常重要的问题,就是手机权限问题,我们需要获取手机的读写权限,联网权限,否则在更新安装包时会下载失败,我在测试时就出现过这样一个问题,因为我手机默认读写权限是放开的,所以我在完成上述步骤之后就能正常更新了,但是到了别人的手机上就会出现下载失败的情况,测试花费了两个小时,所以重点提醒一下,以后有类似的读写操作,不要忘记在读写操作之前申请手机权限

获取权限首先需要添加 权限插件:cordova plugin add cordova-plugin-android-permissions,(Android6.0之后获取权限都需要动态获取,ionic提供了此插件)

获取权限代码如下:

// 权限组,当然也可以是单个权限
var permissionGroup = [

      permissions.WRITE_EXTERNAL_STORAGE,
      permissions.READ_EXTERNAL_STORAGE,
      permissions.INTERNET
    ];

    // 检验是否拥有权限
    permissions.hasPermission(permissionGroup, function(status){

      if(!status.hasPermission ) {

        // 请求权限
        permissions.requestPermissions(permissionGroup,function(status) {

          if(status.hasPermission) {

            // 请求完成之后.....
          } else {

            $timeout(function(){

              $ionicLoading.show({

                template:"请求权限失败,请手动开启"
              })
            }, 3000);
          }
        },function(err){

          alert("requestPermissions,false");
        });
      }
      else {

        installationPackage();
      }

    }, function(){

      alert("hasPermission,false");
    });

以上就是所有用到方法的解释说明,完整代码如下:

angular.module('starter', ['ionic', 'starter.controllers', 'starter.services', 'ngCordova'])

.run(function($ionicPlatform, $cordovaAppVersion, $cordovaFileTransfer, $cordovaFileOpener2, $ionicLoading, $cordovaNetwork, $timeout) {
  $ionicPlatform.ready(function() {
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
    // for form inputs)
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      cordova.plugins.Keyboard.disableScroll(true);

    }
    if (window.StatusBar) {
      // org.apache.cordova.statusbar required
      StatusBar.styleDefault();
    }

    var permissions = cordova.plugins.permissions;
    /**
     * url : 服务器下载路径
     * targetPath : 存储路径
     * trustHosts : 如果设置为true,接受所有安全证书
     * options : 可选参数
     * networkType : 网络状态(4G,WiFi)
     * @type {string}
     */
    var url = "http://192.168.7.23:8080/app/android-debug.apk";
    var targetPath = "file:///mnt/sdcard/Download/android-debug.apk";
    var trustHosts = true;
    var options = {};
    var networkType = $cordovaNetwork.getNetwork();

    var permissionGroup = [

      permissions.WRITE_EXTERNAL_STORAGE,
      permissions.READ_EXTERNAL_STORAGE,
      permissions.INTERNET
    ];

    // 检验是否拥有权限
    permissions.hasPermission(permissionGroup, function(status){

      if(!status.hasPermission ) {

        // 请求权限
        permissions.requestPermissions(permissionGroup,function(status) {

          if(status.hasPermission) {

            installationPackage();
          } else {

            $timeout(function(){

              $ionicLoading.show({

                template:"请求权限失败,请手动开启"
              })
            }, 3000);
          }
        },function(err){

          alert("requestPermissions,false");
        });
      }
      else {

        installationPackage();
      }

    }, function(){

      alert("hasPermission,false");
    });

    // 下載最新安裝包
    function installationPackage() {

      $cordovaAppVersion.getVersionNumber().then(function(version) {

        // 獲取服務器版本號,暂定服务器版本号为1.0.0.1
        var serverVersion = '1.0.0.1';

        if (serverVersion != version) {

          $ionicPopup.confirm({

            title: '更新',
            template : "檢測到當前版本不是最新版本,是否更新?"
          }).then(function (res) {

            if(!res){

              ionic.Platform.exitApp();
            }else {

              // 初始下载进度
              $ionicLoading.show({

                template: "已经下载:0%"
              });

              // 从服务器下载
              $cordovaFileTransfer.download(url, targetPath, options, trustHosts).then(function (result) {

                $cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive').then(function () {

                  ionic.Platform.exitApp();
                }, function (err) {

                  alert("安裝包打開失敗");
                });
                $ionicLoading.hide();
              }, function (err) {

                alert('下载失败');
                ionic.Platform.exitApp();
              }, function (progress) {

                $timeout(function () {
                  var downloadProgress = (progress.loaded / progress.total) * 100;
                  $ionicLoading.show({
                    template: "已经下载:" + Math.floor(downloadProgress) + "%"
                  });
                  if (downloadProgress > 99) {
                    $ionicLoading.hide();
                  }
                });
              });
            }
          });
        }
        else {

          // $state.go('login');
        }
      });
    }
  });
})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值