飞道的博客

uniapp在线升级和热更新实现

437人阅读  评论(0)

第一、分析APP升级的业务

1、每次打开APP需要在全局App.vue中去检测请求后台接口

2、对比版本号校验是否升级 

3、识别是热更新还是在线升级,处理不同业务,热更新下载包使用官方api升级(按照实际接口返回字段判断)

4、识别是强制升级还是非强制升级 弹框提醒用户

5、识别是IOS还是Android升级 用户点击跳转升级

第二、编写代码

1、进入APP.vue  onLaunch下

2、按照业务分析编写升级代码


  
  1. //#ifdef APP-PLUS
  2. // APP检测更新 具体打包流程可以参考:https://ask.dcloud.net.cn/article/35667
  3. plus.screen.lockOrientation( 'portrait-primary'); //竖屏正方向锁定
  4. //获取是否热更新过
  5. const updated = uni.getStorageSync( 'updated'); // 尝试读取storage
  6. if (updated.completed === true) {
  7. // 如果上次刚更新过
  8. // 删除安装包及安装记录
  9. console.log( '安装记录被删除,更新成功');
  10. uni.removeSavedFile({
  11. filePath: updated.packgePath,
  12. success: res => {
  13. uni.removeStorageSync( 'updated');
  14. }
  15. });
  16. } else if (updated.completed === false) {
  17. uni.removeStorageSync( 'updated');
  18. plus.runtime.install(updated.packgePath, {
  19. force: true
  20. });
  21. uni.setStorage({
  22. key: 'updated',
  23. data: {
  24. completed: true,
  25. packgePath: updated.packgePath
  26. },
  27. success: res => {
  28. console.log( '成功安装上次的更新,应用需要重启才能继续完成');
  29. }
  30. });
  31. uni.showModal({
  32. title: '提示',
  33. content: '应用将重启以完成更新',
  34. showCancel: false,
  35. complete: () => {
  36. plus.runtime.restart();
  37. }
  38. });
  39. } else {
  40. //获取当前系统版本信息
  41. plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
  42. //请求后台接口 解析数据 对比版本
  43. this.$Request.getT( '/appinfo/').then( res => {
  44. res = res.data[ 0];
  45. if (res.wgtUrl && widgetInfo.version < res.version) {
  46. let downloadLink = '';
  47. let androidLink = res.androidWgtUrl;
  48. let iosLink = res.iosWgtUrl;
  49. let ready = false;
  50. //校验是是不是热更新
  51. if (res.wgtUrl.match( RegExp( /.wgt/))) {
  52. // 判断系统类型
  53. if (plus.os.name.toLowerCase() === 'android') {
  54. console.log( '安卓系统');
  55. if (androidLink && androidLink !== '#') {
  56. // 我这里默认#也是没有地址,请根据业务自行修改
  57. console.log( '发现下载地址');
  58. // 安卓:创建下载任务
  59. if (androidLink.match( RegExp( /.wgt/))) {
  60. console.log( '确认wgt热更新包');
  61. downloadLink = androidLink;
  62. ready = true;
  63. } else {
  64. console.log( '安卓推荐.wgt强制更新,.apk的强制更新请您自行修改程序');
  65. }
  66. } else {
  67. console.log( '下载地址是空的,无法继续');
  68. }
  69. } else {
  70. console.log( '苹果系统');
  71. if (iosLink && iosLink !== '#') {
  72. // 我这里默认#也是没有地址,请根据业务自行修改
  73. console.log( '发现下载地址');
  74. // 苹果(A):进行热更新(如果iosLink是wgt更新包的下载地址)判断文件名中是否含有.wgt
  75. if (iosLink.match( RegExp( /.wgt/))) {
  76. console.log( '确认wgt热更新包');
  77. downloadLink = iosLink;
  78. ready = true;
  79. } else {
  80. console.log( '苹果只支持.wgt强制更新');
  81. }
  82. } else {
  83. console.log( '下载地址是空的,无法继续');
  84. }
  85. }
  86. if (ready) {
  87. console.log( '任务开始');
  88. let downloadTask = uni.downloadFile({
  89. url: downloadLink,
  90. success: res => {
  91. if (res.statusCode === 200) {
  92. // 保存下载的安装包
  93. console.log( '保存安装包');
  94. uni.saveFile({
  95. tempFilePath: res.tempFilePath,
  96. success: res => {
  97. const packgePath = res.savedFilePath;
  98. // 保存更新记录到stroage,下次启动app时安装更新
  99. uni.setStorage({
  100. key: 'updated',
  101. data: {
  102. completed: false,
  103. packgePath: packgePath
  104. },
  105. success: () => {
  106. console.log( '成功保存记录');
  107. }
  108. });
  109. // 任务完成,关闭下载任务
  110. console.log( '任务完成,关闭下载任务,下一次启动应用时将安装更新');
  111. downloadTask.abort();
  112. downloadTask = null;
  113. }
  114. });
  115. }
  116. }
  117. });
  118. } else {
  119. console.log( '下载地址未准备,无法开启下载任务');
  120. }
  121. } else {
  122. //不是热更新是在线更新 校验是否强制升级
  123. if (res.method == 'true') {
  124. uni.showModal({
  125. showCancel: false,
  126. confirmText: '立即更新',
  127. title: '发现新版本',
  128. content: res.des,
  129. success: res => {
  130. if (res.confirm) {
  131. this.$queue.showLoading( '下载中...');
  132. if (uni.getSystemInfoSync().platform == 'android') {
  133. uni.downloadFile({
  134. url: androidLink,
  135. success: downloadResult => {
  136. if (downloadResult.statusCode === 200) {
  137. plus.runtime.install(
  138. downloadResult.tempFilePath, {
  139. force: false
  140. },
  141. d => {
  142. console.log( 'install success...');
  143. plus.runtime.restart();
  144. },
  145. e => {
  146. console.error( 'install fail...');
  147. }
  148. );
  149. }
  150. }
  151. });
  152. }
  153. if (uni.getSystemInfoSync().platform == 'ios') {
  154. plus.runtime.openURL(iosLink, function(res) {});
  155. }
  156. } else if (res.cancel) {
  157. console.log( '取消');
  158. }
  159. }
  160. });
  161. } else {
  162. uni.showModal({
  163. title: '发现新版本',
  164. confirmText: '立即更新',
  165. cancelText: '下次更新',
  166. content: res.des,
  167. success: res => {
  168. if (res.confirm) {
  169. this.$queue.showLoading( '下载中...');
  170. if (uni.getSystemInfoSync().platform == 'android') {
  171. uni.downloadFile({
  172. url: androidLink,
  173. success: downloadResult => {
  174. if (downloadResult.statusCode === 200) {
  175. plus.runtime.install(
  176. downloadResult.tempFilePath, {
  177. force: false
  178. },
  179. d => {
  180. console.log( 'install success...');
  181. plus.runtime.restart();
  182. },
  183. e => {
  184. console.error( 'install fail...');
  185. }
  186. );
  187. }
  188. }
  189. });
  190. }
  191. if (uni.getSystemInfoSync().platform == 'ios') {
  192. plus.runtime.openURL(iosLink, function(res) {});
  193. }
  194. } else if (res.cancel) {
  195. console.log( '取消');
  196. }
  197. }
  198. });
  199. }
  200. }
  201. }
  202. });
  203. });
  204. }
  205. //#endif

 

 


转载:https://blog.csdn.net/weixin_39706415/article/details/111665160
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场