uniapp开发APP之强制更新和热更新的实现

前言

app和h5相比,有着更新延迟和更新难的特性,h5在部署更新后可以保证所有用户访问的都是最新的功能,而app则可能存在多个版本,用户也可以选择不升级继续使用;

但是有时候,app进行了大规模的调整,导致之前所有版本的app都不可用,或者一些重要功能作出了调整(比如收费内容发生改变),强制用户需要更新app,这样的情况并不少见;

因此在第一版本的app内,就应该把包内更新的功能加上,以保证app的更新续航。

整包更新和热更新

APP的更新分为整包更新和热更新。

整包更新是指下载完整apk文件进行覆盖安装。

热更新是指把app有改动的地方打包进wgt文件,只更新wgt文件中的内容,不进行整包安装,在用户视角也叫做省流量更新

版本号约束

既然是版本更新,那就离开版本号的约束。

因为涉及两种更新方式,所以要先制定版本号的规范:
建议 严格遵循 Semantic Versioning 2.0.0 语义化版本规范。

主版本号:不兼容的 API 修改

次版本号:向下兼容的功能性新增

修订号:向下兼容的问题修正

实现原理

  • 开发后台版本管理功能,每次发版上传android安装包,记录版本号、是热更新还是整包更新、是否强制更新等
  • 每次打开app(onLaunch生命周期)的时候,通过接口请求最新版本信息,再获取当前安装包信息,对比版本号
  • 如果版本号不一致,且接口获取的版本号大于当前应用的版本号,则进行整包更新或热更新。
  • 需要注意的是,ios并不存在下载安装包覆盖安装这种操作,所以在ios平台需要跳转到appstore进行更新

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

export default {

 onLaunch: function() {

     // 条件编译,只在app环境下进行更新操作

  // #ifdef APP-PLUS 

  if (process.env.NODE_ENV === 'production') { // 只在正式环境下启用,避免更新影响开发和测试环境(这步取决于你的需求)

   

      // 获取app运行信息

   plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {

        

       // 通过接口获取最新版本信息,具体请求不演示

    getVersion({

     platform: '1'

    }).then(res => {

     

     if (!res) {

      return;

     }

                     

                    // 版本号得到的是类似 '7.0.1'的字符串,把它去除.并转为纯数字

     const appCode = parseInt(res.app_code.split('.').join(''))

     const version = parseInt(widgetInfo.version.split('.').join(''))

     if (appCode > version) { // 只有接口版本号 > 当前包版本号才进行更新

         // type为0热更新(看接口设计)

      if (res.type == '0') { // 热更新,下载更新文件,这一步可以先显示更新提示的ui,用户点击更新后再下载更新

       this.updateHot(res.download_url)

      } else if (res.type == '1') { // 整包更新,这一步可以先显示更新提示的ui,用户点击更新后再下载更新

          this.updatePackage(res.download_url)

      }

     }

    }).catch(err => {

     console.error(err)

    })

   });

  }

 },

 methods: {

     // 整包更新

     updatePackage(url) {

      

         // ios平台不允许这样更新,所以我们需要跳转到appstore进行更新

        if (uni.getSystemInfoSync().platform === 'ios') {

          plus.runtime.launchApplication({

     action: 'itms-apps://xxx' // 链接可以通过接口获取

    });

         } else {

          this.isDownloading = true

           

          // 构建了下载任务,但此时并未开始下载

          const dtask = plus.downloader.createDownload(url, {},

           (downloadResult, status) => {

            if (status === 200) {

             plus.runtime.install(downloadResult.filename, {

           force: false

          },

          function() {

           plus.runtime.restart(); // 安装成功后重启

          },

          function(e) {

           uni.showToast({

            icon: 'none',

            title: '下载更新失败'

           })

          });

            }

           }

          );

         

                // 执行安装包下载

          dtask.start();

         }

     },

     // 热更新

     updateHot(url) {

         uni.downloadFile({

    url,

    success: (downloadResult) => {

     if (downloadResult.statusCode === 200) {

         // 下载更新文件成功后进行安装

      plus.runtime.install(downloadResult.tempFilePath, {

       force: false // 是否强制安装, 如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。

      },

      function() {

       uni.showToast({

        title:'更新完毕,即将重启',

        icon: 'none',

        position: 'bottom'

       })

       setTimeout(() => {

        plus.runtime.restart(); // 安装完成后重启应用

       },2000)

      })

     }

    }

   });

     }

 }

}

其中有个部分要放入你的后端接口。(千万不要漏了这一步,不然会下载失败)

// 通过接口获取最新版本信息,具体请求不演示

getVersion({

_apiname:"xxx.xxx.xxxx", //这里放入后端给的接口 每个公司格式不一样 按自己喜好来

platform: '1'

}).then(res => {

if (!res) {

return;

}

 

其他方案

插件市场提供了uni-upgrade-center升级方案,包含了后台管理app版本以及app自动更新的逻辑,需要注意的是后台管理是基于uni-admin框架的插件,如果应用内没有使用uni-admin,集成起来会相对麻烦

参考资料

uni-app 资源在线升级/热更新

 

转载于:uniapp开发APP之强制更新和热更新的实现_javascript技巧_脚本之家 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp app开发热更新可以通过以下步骤实现: 1. 在uni-app项目的根目录下创建一个名为`update`的文件夹,用于存放热更新的资源文件。 2. 在`update`文件夹中创建一个名为`manifest.json`的文件,用于记录热更新的版本信息和资源文件列表。示例内容如下: ```json { "version": "1.0.0", "packages": [ { "path": "update.zip", "md5": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] } ``` 其中,`version`表示当前热更新的版本号,`packages`数组中的每个对象表示一个资源包,`path`表示资源包的路径,`md5`表示资源包的MD5值。 3. 将需要热更新的资源文件打包成一个zip文件,命名为`update.zip`,并放置在`update`文件夹中。 4. 在uni-app项目的`main.js`文件中添加热更新的代码。示例代码如下: ```javascript import { checkUpdate, downloadUpdate, applyUpdate } from 'uni-updater'; // 检查是否有新版本 checkUpdate({ url: 'http://example.com/update/manifest.json', // 热更新资源的manifest.json文件的URL success: (res) => { if (res.hasUpdate) { // 下载新版本资源 downloadUpdate({ url: 'http://example.com/update/update.zip', // 热更新资源的zip文件的URL success: (res) => { // 应用新版本资源 applyUpdate({ success: () => { // 热更新成功 }, fail: (err) => { // 热更新失败 } }); }, fail: (err) => { // 下载资源失败 } }); } }, fail: (err) => { // 检查更新失败 } }); ``` 以上代码中,`checkUpdate`函数用于检查是否有新版本的热更新资源,`downloadUpdate`函数用于下载新版本的热更新资源,`applyUpdate`函数用于应用新版本的热更新资源。 请注意,以上代码中的URL需要替换为实际的热更新资源的URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值