> 使用 uni-app 开发,可将代码编译到iOS、Android、微信小程序等多个平台,升级时也需考虑多平台同步升级。
> * uni-app发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级
> * iOS/Android App 的升级需开发者自己处理,本文主要简介 App 的整包升级模式。
> App热更新(升级包方式)另见文档:http://ask.dcloud.net.cn/article/35667
[TOC]
## 实现流程
> 请求地址:https://www.example.com/update
> 请求数据:
~~~json
{
"appid": plus.runtime.appid,
"version": plus.runtime.version
}
~~~
> 响应数据:
~~~json
{
"status":1,//升级标识,0:无需升级;1:建议更新;2:强制更新
"note": "修复bug1;\n修复bug2;",//release notes
"url": "http://www.example.com/uniapp.apk" //更新包下载地址
}
~~~
## 客户端实现
> App启动时,向服务端上报当前版本号,服务端判断是否提示升级。
> 在App.vue的onLaunch中,发起升级检测请求
### 建议更新
~~~javascript
onLaunch: function () {
//#ifdef APP-PLUS
var server = "https://www.example.com/update"; //检查更新地址
var req = { //升级检测数据
"appid": plus.runtime.appid,
"version": plus.runtime.version
};
uni.request({
url: server,
data: req,
success: (res) => {
if (res.data.status === 1) {
uni.showModal({ //提醒用户更新
title: "更新提示",
content: res.data.note,
success: (res) => {
if (res.confirm) {
plus.runtime.openURL(res.data.url);
}
}
})
}
}
})
//#endif
}
~~~
> **注意:** App的升级检测代码必须使用条件编译,否则在非App环境由于不存在plus相关API,将会报错。
### 强制更新
> 参考上面的方法,把showModel换成自己写的一个弹窗,只有升级按钮,无关闭按钮。这样就强制更新了。
> 注意uniapp的app.vue不能引入任一组件,不然打包就会报错。
> 市场里也有很多插件,也可以直接使用,如:https://ext.dcloud.net.cn/plugin?id=543 (可分安装包,升级包。安卓是在应用内下载,不跳转web)
## 服务端实现
> 根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等)
~~~
header("Content-type:text/json");
$appid = $_GET["appid"];
$version = $_GET["version"]; //客户端版本号
$rsp = array("status" => 0); //默认返回值,不需要升级
if (isset($appid) && isset($version)) {
if ($appid === "__UNI__123456") { //校验appid
if ($version !== "1.0.1") { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中
$rsp["status"] = 1;
$rsp["note"] = "修复bug1;\n修复bug2;"; //release notes
$rsp["url"] = "http://www.example.com/uniapp.apk"; //应用升级包下载地址
}
}
}
echo json_encode($rsp);
exit;
~~~
## 常见问题
版本检测需要打包app,真机运行基座无法测试。因为真机运行的plus.runtime.version是固定值。
> 参考文档:
> https://www.jianshu.com/p/219fd6b914d3
> https://ask.dcloud.net.cn/article/34972
> https://ask.dcloud.net.cn/article/35667)
- 基础知识
- UNI核心介绍
- flex布局
- 生命周期
- 全局方法
- 组件定义
- 自定义组件
- 全局组件
- 组件之间的数据传输
- 条件编译
- 自定义头部
- 节点信息 (SelectorQuery)
- vuejs基础语法
- 页面跳转以及参数传递
- 事件的监听注册以及触发
- css3动画
- block的妙用
- mixin (混入)
- uniapp快捷键
- vuex状态管理
- 实用功能
- 获取服务提供商
- 启动页 / 启动界面
- 引导页
- tabbar配置
- 头部导航栏基础设置
- 上拉下拉(刷新/加载)
- 第三方登录
- 第三方分享
- 推送通知 之 unipush
- scroll-view双联动
- 配置iOS通用链接(Universal Links)
- 本地缓存操作
- 升级/更新方案
- 热更新
- 图片上传
- 搜索页实现
- canvas绘图助手
- 地图定位
- 第三方支付————todo
- 分类轮播
- 清除应用缓存
- uniapp与webview的实时通讯
- 视频-----todo
- 聊天----todo
- 长列表swiper左右切换
- 第三方插件
- uview
- mescroll
- uCharts (图表)
- 无名 (更新插件)
- 第三方模版
- 自定义基座
- 打包发行
- 要封装的方法
- 缓存 cache.js
- 请求接口 request.js
- 工具类 util.js
- 小程序登录 xcxLogin.js
- 版本更新 update.js
- 优质插件
- 更新插件----todo
- 语音
- 语音识别 (含上传)
- 百度语音合成播报接口
- 官方常用组建
- input 输入框
- image 图片
- audio 音频
- picker 选择器
- video 视频
- scroll-view 滚动视图