Ionic实战 自动升级APP(Android版)
最近项目收尾,提出了一些新的需求,希望每次更新都能如QQ,WeChat一样,在有新版本的时候,自动对其进行下载更新,根据实际的应用环境,此功能确实应该实现,于是查阅了相关资料,实现了此功能~,现对此进行总结如下,若有错误见解请批评性指出~
Ionic 自动升级APP
一、准备工作
1.Cordova插件:
cordova plugin add https://github.com/whiteoctober/cordova-plugin-app-version.git // 获取APP版本
cordova plugin add org.apache.cordova.file // 文件系统
cordova plugin add org.apache.cordova.file-transfer //文件传输系统
cordova plugin add https://github.com/pwlin/cordova-plugin-file-opener2 //文件打开系统
2.AngularJS Cordova插件
直接引用即可:<script src="lib/ngCordova/dist/ng-cordova.js"></script>
二、相关代码,app.js
1 angular.module('mpApp', ['ionic', 'mpControllers', 'mpServices','mpFilters']) 2 .run(function($ionicPlatform,$rootScope,$ionicActionSheet, $timeout,$cordovaAppVersion, $ionicPopup, $ionicLoading, $cordovaFileTransfer, $cordovaFile, $cordovaFileOpener2,$http) { 3 $ionicPlatform.ready(function() { 4 if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 5 cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 6 cordova.plugins.Keyboard.disableScroll(true); 7 8 } 9 if (window.StatusBar) { 10 StatusBar.styleDefault(); 11 }; 12 if (window.cordova && window.cordova.InAppBrowser) { 13 window.open = window.cordova.InAppBrowser.open; 14 } 15 setTimeout(function () { 16 // navigator.splashscreen.hide(); 17 }, 100); 18 19 20 21 //启用极光推送服务 22 try { 23 window.plugins.jPushPlugin.init(); 24 window.plugins.jPushPlugin.setDebugMode(true); 25 26 } catch (exception) { 27 console.log(exception); 28 } 29 30 /* 31 var onReceiveNotification = function (event) { 32 try { 33 console.log('接收新的推送通知'); 34 //var alert = event.aps.alert;//通知内容 35 window.plugins.jPushPlugin.setBadge(event.aps.badge); 36 console.log("JPushPlugin:onReceiveNotification key aps.alert:" + alert); 37 } 38 catch (exeption) { 39 console.log(exception) 40 } 41 42 var onTagsWithAlias =function(event){ 43 alert("onTagsWithAlias方法执行"); 44 window.plugins.jPushPlugin.getRegistrationID(function(id){ 45 //将获取到的id存入服务端 46 alert(id);这里就可以获取到注册的ID了 47 }); 48 ) 49 //打开通知 50 var onOpenNotification = function (event) { 51 try { 52 console.log('打开通知消息'); 53 window.plugins.jPushPlugin.setBadge(0); 54 window.plugins.jPushPlugin.resetBadge(); 55 window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); 56 $state.go('app.bookshelf'); 57 } 58 catch (exeption) { 59 console.log(exception) 60 } 61 }; 62 63 document.addEventListener("jpush.receiveNotification", onReceiveNotification, false); 64 document.addEventListener("jpush.openNotification", onOpenNotification, false); 65 */ 66 //检测更新 67 checkUpdate(); 68 document.addEventListener("menubutton", onHardwareMenuKeyDown, false); 69 70 71 }); 72 // 菜单键 73 function onHardwareMenuKeyDown() { 74 $ionicActionSheet.show({ 75 titleText: '检查更新', 76 buttons: [ 77 { text: '关于' } 78 ], 79 destructiveText: '检查更新', 80 cancelText: '取消', 81 cancel: function () { 82 // add cancel code.. 83 }, 84 destructiveButtonClicked: function () { 85 //检查更新 86 checkUpdate(); 87 }, 88 buttonClicked: function (index) { 89 90 } 91 }); 92 $timeout(function () { 93 hideSheet(); 94 }, 2000); 95 }; 96 97 // 检查更新 98 function checkUpdate() { 99 //从服务端获取最新版本 100 var ApiUrl ="http://www.xxx.com/ver.json";//版本信息存放在服务器上的地址 101 var serverAppVersion = ""; //最新版本信息 102 $http.get(ApiUrl) 103 .success(function (data) { 104 //获取版本 105 serverAppVersion = data.version[0].value; 106 serverAppContent = data.version[0].content; 107 cordova.getAppVersion.getVersionNumber().then(function (version) { 108 //如果本地与服务端的APP版本不符合 109 if (version != serverAppVersion) { 110 //两种更新方式 111 showUpdateConfirm(serverAppVersion,serverAppContent); 112 } 113 }); 114 }) 115 .error(function (data, status, headers, config) { 116 $ionicLoading.show({template: '读取版本信息失败!', noBackdrop: true, duration: 2000}); 117 }); 118 119 } 120 121 // 显示是否更新对话框 122 function showUpdateConfirm(version,content) { 123 var confirmPopup = $ionicPopup.confirm({ 124 title: '版本升级'+version, 125 template: content, //从服务端获取更新的内容 126 cancelText: '取消', 127 okText: '升级' 128 }); 129 confirmPopup.then(function (res) { 130 if (res) { 131 $ionicLoading.show({ 132 template: "已经下载:0%" 133 }); 134 var url = "http://www.xxx.com/xxx.apk"; //可以从服务端获取更新APP的路径 135 var filename = url.split("/").pop(); 136 var targetPath = cordova.file.externalRootDirectory + filename;//APP下载存放的路径,可以使用cordova file插件进行相关配置 137 //var targetPath = cordova.file.externalDataDirectory + filename; 138 var trustHosts = true 139 var options = {}; 140 $cordovaFileTransfer.download(url, targetPath, options, trustHosts).then(function (result) { 141 // 打开下载下来的APP 142 $cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive' 143 ).then(function () { 144 // 成功 145 }, function (err) { 146 // 错误 147 }); 148 $ionicLoading.hide(); 149 }, function (err) { 150 alert('下载失败'); 151 $ionicLoading.hide(); 152 }, function (progress) { 153 //进度,这里使用文字显示下载百分比 154 $timeout(function () { 155 var downloadProgress = (progress.loaded / progress.total) * 100; 156 $ionicLoading.show({ 157 template: "已经下载:" + Math.floor(downloadProgress) + "%" 158 }); 159 if (downloadProgress > 99) { 160 $ionicLoading.hide(); 161 } 162 }) 163 }); 164 } else { 165 // 取消更新 166 } 167 }); 168 } 169 170 171 })
三、服务器存放版本文件内容,ver.json
1 { 2 "version":[{ 3 "value":"1.0.1", 4 "content":"1.增加自动升级功能;</br>2.优化图片上传;</br>3.优化暂停任务可从相册选择;</br>4.上传图片显示进度条" 5 }] 6 }
四、每次打包,修改打包配置文件config.xml
1 <widget id="com.ionicframework.mjlms" version="1.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
五、总结
至此,整个的功能实现完毕,如果安卓手机端安装的是1.0.1版本,当新功能添加完毕,需要重新打包,则修改config.xml文件的版本为1.0.2,同时更新服务器上的ver.json文件,然后将最新的apk放到对应地址~当再次在手机上打开1.0.1版本软件的时候,就会提示更新内容,下载更新即可~