提交 a921045c 编写于 作者: L linju

21

上级 14d1d150
unpackage/ unpackage/
.hbuilderx .hbuilderx
node_modules node_modules
.DS_Store .DS_Store
\ No newline at end of file uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/config.json
\ No newline at end of file
...@@ -77,15 +77,15 @@ ...@@ -77,15 +77,15 @@
"oauth" : { "oauth" : {
"apple" : {}, "apple" : {},
"weixin" : { "weixin" : {
"appid" : "wx0411fa6a39d61297", "appid" : "wxffdd8fa6ec4ef2a0",
"appsecret" : "", "appsecret" : "6c9119430d7be0a147bcbbb73ef33acf",
"UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E" "UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
}, },
"univerify" : {} "univerify" : {}
}, },
"share" : { "share" : {
"weixin" : { "weixin" : {
"appid" : "wx0411fa6a39d61297", "appid" : "wxffdd8fa6ec4ef2a0",
"UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E", "UniversalLinks" : "https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E",
"_spaceID" : "76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e" "_spaceID" : "76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e"
} }
......
<template> <template>
<view class="content" > <view class="content" >
<limeClipper :width="options.width" :scale-ratio="2" :is-lock-width="true" :is-lock-height="true" :height="options.height" :image-url="path" <limeClipper :width="options.width" :scale-ratio="2" :is-lock-width="false" :is-lock-height="false" :height="options.height" :image-url="path"
@success="successFn" @cancel="cancel" /> @success="successFn" @cancel="cancel" />
</view> </view>
</template> </template>
......
{
"passwordSecret": "passwordSecret-demo",
"tokenSecret": "tokenSecret-demo",
"tokenExpiresIn": 7200,
"tokenExpiresThreshold": 600,
"passwordErrorLimit": 6,
"bindTokenToDevice": true,
"passwordErrorRetryTime": 3600,
"autoSetInviteCode": false,
"forceInviteCode": false,
"app-plus": {
"tokenExpiresIn": 2592000,
"oauth": {
"weixin": {
"appid": "wx0411fa6a39d61297",
"appsecret": "6c9119430d7be0a147bcbbb73ef33acf"
},
"apple": {
"bundleId": "io.dcloud.game.cat"
}
}
},
"mp-weixin": {
"oauth": {
"weixin": {
"appid": "wx999bf02c8e05dfc9",
"appsecret": "b5f608afd332b2c0ded7e6b98ca4ccd3"
}
}
},
"mp-alipay": {
"oauth": {
"alipay": {
"appid": "alipay appid",
"privateKey": "alipay privateKey"
}
}
},
"service": {
"sms": {
"name": "DCloud",
"codeExpiresIn": 300,
"smsKey": "71a19f38c954f7d768d68a050486bf15",
"smsSecret": "d6c424b702d73baa3b6e1a1452469213"
},
"univerify": {
"appid": "__UNI__BC54A00",
"apiKey": "d1e36bcd497b3795434d900dcfdd44dc",
"apiSecret": "2feb378ff1114362b20ac179b572293e"
}
}
}
...@@ -98,12 +98,15 @@ ...@@ -98,12 +98,15 @@
let oauthService = this.oauthServices.find((service) => service.id == type) let oauthService = this.oauthServices.find((service) => service.id == type)
// #ifdef APP-PLUS // #ifdef APP-PLUS
//uni.showLoading({mask: true}); //uni.showLoading({mask: true});
console.log(type,231);
//请勿直接使用前端获取的unionid或openid直接用于登陆,前端的数据都是不可靠的 //请勿直接使用前端获取的unionid或openid直接用于登陆,前端的数据都是不可靠的
if(type=='weixin'){ if(type=='weixin'){
oauthService.authorize(({code})=>{ oauthService.authorize(({code})=>{
console.log(code); console.log(code);
this.quickLogin({code},type) this.quickLogin({code},type)
},
err=>{
console.log(err);
}) })
} }
......
## 0.1.2(2021-04-07)
- 更新版本对比函数 compare
## 0.1.1(2021-04-07)
- 修复 腾讯云空间下载链接不能下载问题
## 0.1.0(2021-04-07)
- 新增使用uni.showModal提示升级示例
- 修改iOS升级提示方式
## 0.0.7(2021-04-02)
- 修复在iOS上打开弹框报错
## 0.0.6(2021-04-01) ## 0.0.6(2021-04-01)
- 兼容旧版本安卓 - 兼容旧版本安卓
## 0.0.5(2021-04-01) ## 0.0.5(2021-04-01)
......
{ {
"id": "uni-upgrade-center-app", "id": "uni-upgrade-center-app",
"displayName": "升级中心 uni-upgrade-center - App", "displayName": "升级中心 uni-upgrade-center - App",
"version": "0.0.6", "version": "0.1.2",
"description": "升级中心前台检查更新", "description": "升级中心前台检查更新",
"keywords": [ "keywords": [
"uniCloud", "uniCloud",
"admin", "admin",
"update", "update",
"升级", "升级",
"wgt" "wgt"
], ],
"repository": "https://gitee.com/dcloud/uni-upgrade-center/tree/master/uni_modules/uni-upgrade-center-app", "repository": "https://gitee.com/dcloud/uni-upgrade-center/tree/master/uni_modules/uni-upgrade-center-app",
"engines": { "engines": {
"HBuilderX": "^3.1.0" "HBuilderX": "^3.1.0"
}, },
"dcloudext": { "dcloudext": {
"category": [ "category": [
"uniCloud", "uniCloud",
"云端一体页面模板" "云端一体页面模板"
], ],
"sale": { "sale": {
"regular": { "regular": {
"price": "0.00" "price": "0.00"
}, },
"sourcecode": { "sourcecode": {
"price": "0.00" "price": "0.00"
} }
}, },
"contact": { "contact": {
"qq": "" "qq": ""
}, },
"declaration": { "declaration": {
"ads": "无", "ads": "无",
"data": "插件不采集任何数据", "data": "插件不采集任何数据",
"permissions": "无" "permissions": "无"
}, },
"npmurl": "" "npmurl": ""
}, },
"uni_modules": { "uni_modules": {
"dependencies": [], "dependencies": [],
"encrypt": [], "encrypt": [],
"platforms": { "platforms": {
"cloud": { "cloud": {
"tcb": "y", "tcb": "y",
"aliyun": "y" "aliyun": "y"
}, },
"client": { "client": {
"App": { "App": {
"app-vue": "u", "app-vue": "u",
"app-nvue": "u" "app-nvue": "u"
}, },
"H5-mobile": { "H5-mobile": {
"Safari": "u", "Safari": "u",
"Android Browser": "u", "Android Browser": "u",
"微信浏览器(Android)": "u", "微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u" "QQ浏览器(Android)": "u"
}, },
"H5-pc": { "H5-pc": {
"Chrome": "u", "Chrome": "u",
"IE": "u", "IE": "u",
"Edge": "u", "Edge": "u",
"Firefox": "u", "Firefox": "u",
"Safari": "u" "Safari": "u"
}, },
"小程序": { "小程序": {
"微信": "u", "微信": "u",
"阿里": "u", "阿里": "u",
"百度": "u", "百度": "u",
"字节跳动": "u", "字节跳动": "u",
"QQ": "u" "QQ": "u"
}, },
"快应用": { "快应用": {
"华为": "u", "华为": "u",
"联盟": "u" "联盟": "u"
} }
} }
} }
} }
} }
# uni-upgrade-center - App # uni-upgrade-center - App
### 概述 ### 概述
> 统一管理App及App在`Android`、`iOS`平台上`App安装包`和`wgt资源包`的发布升级 > 统一管理App及App在`Android`、`iOS`平台上`App安装包`和`wgt资源包`的发布升级
> 本插件为升级中心前台检查更新,后台Admin管理系统请点击查看 [uni-upgrade-center](https://ext.dcloud.net.cn/plugin?id=4470) > 本插件为升级中心前台检查更新,后台Admin管理系统请点击查看 [uni-upgrade-center](https://ext.dcloud.net.cn/plugin?id=4470)
### 基于uni-upgrade-center的App前台检查升级插件 ### 基于uni-upgrade-center的App前台检查升级插件
- 一键式检查更新,统一整包与wgt资源包更新 - 一键式检查更新,统一整包与wgt资源包更新
- 好看、实用、可自定义、可拓展的前台更新弹框 - 好看、实用、可自定义、可拓展的前台更新弹框
## 安装指引
1. 使用`HBuilderX 3.1.0+`,因为要使用到`uni_modules`
3. 在插件市场打开本插件页面,在右侧点击`使用 HBuilderX 导入插件`,选择要导入的项目点击确定
## 安装指引
1. 使用`HBuilderX 3.1.0+`,因为要使用到`uni_modules`
3. 在插件市场打开本插件页面,在右侧点击`使用 HBuilderX 导入插件`,选择要导入的项目点击确定
5. 找到`/uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version`,右键上传部署 5. 找到`/uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version`,右键上传部署
6.`pages.json`中添加页面路径 6.`pages.json`中添加页面路径
```json ```json
"pages": [ "pages": [
// ……其他页面配置 // ……其他页面配置
{ {
"path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup", "path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup",
"style": { "style": {
"disableScroll": true, "disableScroll": true,
"app-plus": { "app-plus": {
"backgroundColorTop": "transparent", "backgroundColorTop": "transparent",
"background": "transparent", "background": "transparent",
"titleNView": false, "titleNView": false,
"scrollIndicator": false, "scrollIndicator": false,
"popGesture": "none", "popGesture": "none",
"animationType": "fade-in", "animationType": "fade-in",
"animationDuration": 200 "animationDuration": 200
} }
} }
} }
] ]
``` ```
7.`/uni_modules/uni-upgrade-center-app/utils/check-update`import到需要用到的地方,调用一下即可 7.`/uni_modules/uni-upgrade-center-app/utils/check-update`import到需要用到的地方,调用一下即可
8. 升级弹框可自行编写,也可以使用`uni.showModal`,或使用现有的升级弹框样式,如果不满足UI需求请自行替换资源文件。在`utils/check-update.js`中都有实例。
### 更新下载安装`check-update.js` ### 更新下载安装`check-update.js`
*该函数在utils目录下* *该函数在utils目录下*
1. 如果是静默更新,则不会打开更新弹框,会在后台下载后安装,下次启动应用生效 1. 如果是静默更新,则不会打开更新弹框,会在后台下载后安装,下次启动应用生效
2. 如果是 iOS,则会直接打开AppStore的链接 2. 如果是 iOS,则会直接打开AppStore的链接
3. 其他情况,会将`check-version`返回的结果保存在localStorage中,并跳转进入`upgrade-popup.vue`打开更新弹框 3. 其他情况,会将`check-version`返回的结果保存在localStorage中,并跳转进入`upgrade-popup.vue`打开更新弹框
### 检查更新函数`check-version` ### 检查更新函数`check-version`
*该函数在uniCloud/cloudfunctions目录下* *该函数在uniCloud/cloudfunctions目录下*
1. 使用检查更新需要传递三个参数 `appid``appVersion``wgtVersion` 1. 使用检查更新需要传递三个参数 `appid``appVersion``wgtVersion`
2. `appid` 使用 plus.runtime.appid 获取,*注:真机运行时为固定值HBuilder,在调试的时候请使用本地调试云函数* 2. `appid` 使用 plus.runtime.appid 获取,*注:真机运行时为固定值HBuilder,在调试的时候请使用本地调试云函数*
3. `appVersion` 使用 plus.runtime.version 获取 3. `appVersion` 使用 plus.runtime.version 获取
4. `wgtVersion` 使用 plus.runtime.getProperty(plus.runtime.appid,(wgtInfo) => { wgtInfo.version }) 获取 4. `wgtVersion` 使用 plus.runtime.getProperty(plus.runtime.appid,(wgtInfo) => { wgtInfo.version }) 获取
5. `check-version`云函数内部会自动获取 App 平台 5. `check-version`云函数内部会自动获取 App 平台
6. 检查更新前端使用示例:`uni_modules/uni-upgrade-center-app/utils/check-update.js`,在要用的地方导入调用即可 6. 检查更新前端使用示例:`uni_modules/uni-upgrade-center-app/utils/check-update.js`,在要检查更新的地方导入调用即可
## 项目代码说明 ## 项目代码说明
### 更新弹框 ### 更新弹框
- `upgrade-popup.vue` - 更新应用: - `upgrade-popup.vue` - 更新应用:
- 如果`check-version`返回的参数表明需要更新,则将参数保存在localStorage中,带着键值跳转该页面 - 如果`check-version`返回的参数表明需要更新,则将参数保存在localStorage中,带着键值跳转该页面
- 进入时会先从localStorage中尝试取出之前存的安装包路径(此包不会是强制安装类型的包) - 进入时会先从localStorage中尝试取出之前存的安装包路径(此包不会是强制安装类型的包)
- 如果有已经保存的包,则和传进来的 `version` 进行比较,如果相等则安装。大于和小于都不进行安装,因为admin端可能会调整包的版本。不符合更新会将此包删除 - 如果有已经保存的包,则和传进来的 `version` 进行比较,如果相等则安装。大于和小于都不进行安装,因为admin端可能会调整包的版本。不符合更新会将此包删除
- 如果本地没有包或者包不符合安装条件,则进行下载安装包 - 如果本地没有包或者包不符合安装条件,则进行下载安装包
- 点击下载会有进度条、已下载大小和下载包的大小 - 点击下载会有进度条、已下载大小和下载包的大小
- 下载完成会提示安装: - 下载完成会提示安装:
- 如果是 wgt 包,安装时则会提示 正在安装…… 和 安装完成。安装完成会提示是否重启 - 如果是 wgt 包,安装时则会提示 正在安装…… 和 安装完成。安装完成会提示是否重启
- 如果是 原生安装包,则直接跳出去覆盖安装 - 如果是 原生安装包,则直接跳出去覆盖安装
- 下载过程中,如果退出会提示是否取消下载。如果是强制更新,则只会提示正在下载请稍后,此时不可退出 - 下载过程中,如果退出会提示是否取消下载。如果是强制更新,则只会提示正在下载请稍后,此时不可退出
- 如果是下载完成了没有安装就退出,则会将下载完成的包保存在本地。将包的本地路径和包version保存在localStorage中 - 如果是下载完成了没有安装就退出,则会将下载完成的包保存在本地。将包的本地路径和包version保存在localStorage中
### 云函数 ### 云函数
- `check-version` - 检查应用更新: - `check-version` - 检查应用更新:
- 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传 - 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
- 先从数据库取出所有该平台(会从上下文读取平台信息)的所有线上发行更新 - 先从数据库取出所有该平台(会从上下文读取平台信息)的所有线上发行更新
- 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新 - 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
- 使用上一步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新。必须同时大于这两项,因为上一次可能是wgt热更新,否则返回暂无更新 - 使用上一步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新。必须同时大于这两项,因为上一次可能是wgt热更新,否则返回暂无更新
- 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion - 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// 配置教程参考:https://uniapp.dcloud.net.cn/uniCloud/quickstart?id=runparam // 配置教程参考:https://uniapp.dcloud.net.cn/uniCloud/quickstart?id=runparam
{ {
"appid": "uni.UNIBC54A00", "appid": "__YOUR_APPID__",
"appVersion": "2.2.0", "appVersion": "2.2.0",
"wgtVersion": "2.2.2" "wgtVersion": "2.2.2"
} }
...@@ -124,14 +124,44 @@ exports.main = async (event, context) => { ...@@ -124,14 +124,44 @@ exports.main = async (event, context) => {
}; };
/** /**
* 对比版本号,如需要,请自行修改判断规则 * 对比版本号,如需要,请自行修改判断规则
* 支持比对 ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1") ("3.0.0.1", "3.0") ("3.1.1", "3.1.1.1") 之类的
* @param {Object} v1 * @param {Object} v1
* @param {Object} v2 * @param {Object} v2
* v1 > v2 return 1 * v1 > v2 return 1
* v1 < v2 return -1 * v1 < v2 return -1
* v1 == v2 return 0 * v1 == v2 return 0
*/ */
function compare(v1 = 0, v2 = 0) { function compare(v1 = '0', v2 = '0') {
// '1.2.5' > '1.2.4' 类似的版本号可以直接对比 v1 = String(v1).split('.')
return v1 > v2 ? 1 : v1 < v2 ? -1 : 0; v2 = String(v2).split('.')
const minVersionLens = Math.min(v1.length, v2.length);
let result = 0;
for (let i = 0; i < minVersionLens; i++) {
const curV1 = Number(v1[i])
const curV2 = Number(v2[i])
if (curV1 > curV2) {
result = 1
break;
} else if(curV1 < curV2) {
result = -1
break;
}
}
if (result === 0 && (v1.length !== v2.length)) {
const v1BiggerThenv2 = v1.length > v2.length;
const maxLensVersion = v1BiggerThenv2 ? v1 : v2;
for (let i = minVersionLens; i < maxLensVersion.length; i++) {
const curVersion = Number(maxLensVersion[i])
if (curVersion > 0) {
v1BiggerThenv2 ? result = 1 : result = -1
break;
}
}
}
return result;
} }
// 推荐再App.vue中使用 // 推荐再App.vue中使用
const PACKAGE_INFO_KEY = '__package_info__' const PACKAGE_INFO_KEY = '__package_info__'
export default function() { export default function() {
// #ifdef APP-PLUS // #ifdef APP-PLUS
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
uniCloud.callFunction({
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { name: 'check-version',
uniCloud.callFunction({ data: {
name: 'check-version', appid: plus.runtime.appid,
data: { appVersion: plus.runtime.version,
appid: plus.runtime.appid, wgtVersion: widgetInfo.version
appVersion: plus.runtime.version, },
wgtVersion: widgetInfo.version success: async (e) => {
}, if (!e.result) return;
success: (e) => { const {
if (!e.result) return; code,
const { message,
code, is_silently, // 是否静默更新
message, url, // 安装包下载地址
is_silently, // 是否静默更新 platform, // 安装包平台
url, // 安装包下载地址 type // 安装包类型
platform, // 安装包平台 } = e.result;
type // 安装包类型
} = e.result; // 此处逻辑仅为实例,可自行编写
// 此处逻辑仅为实例,可自行编写
if (code > 0) { if (code > 0) {
// 静默更新,只有wgt有 // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
if (is_silently) { const {
downloadTask = uni.downloadFile({ fileList
url: this.url, } = await uniCloud.getTempFileURL({
success: res => { fileList: [url]
if (res.statusCode == 200) { });
// 下载好直接安装,下次启动生效 e.result.url = fileList[0].tempFileURL
plus.runtime.install(res.tempFilePath, {
force: false // 静默更新,只有wgt有
}); if (is_silently) {
} uni.downloadFile({
} url: e.result.url,
}); success: res => {
return; if (res.statusCode == 200) {
} // 下载好直接安装,下次启动生效
plus.runtime.install(res.tempFilePath, {
if (type === 'native_app' && platform.includes('iOS')) { force: false
// iOS 跳转 AppStore 商店 });
plus.runtime.openURL(url); }
return; }
} });
return;
uni.setStorageSync(PACKAGE_INFO_KEY, e.result) }
// 跳转更新页面 /**
uni.navigateTo({ * 提示升级一
url: '/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=' + * 使用 uni.showModal
PACKAGE_INFO_KEY, */
fail: (err) => { // return updateUseModal(e.result)
console.error('更新弹框跳转失败', err)
uni.removeStorageSync(PACKAGE_INFO_KEY) /**
} * 提示升级二
}) * 官方适配的升级弹窗,可自行替换资源适配UI风格
} else if (code < 0) { */
// TODO 云函数报错处理 uni.setStorageSync(PACKAGE_INFO_KEY, e.result)
console.error(message) uni.navigateTo({
} url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`,
}, fail: (err) => {
fail: (err) => { console.error('更新弹框跳转失败', err)
// TODO 云函数报错处理 uni.removeStorageSync(PACKAGE_INFO_KEY)
console.error(err.message) }
} })
}) } else if (code < 0) {
}); // TODO 云函数报错处理
// #endif console.error(message)
}
},
fail: (err) => {
// TODO 云函数报错处理
console.error(err.message)
}
})
});
// #endif
}
/**
* 使用 uni.showModal 升级
*/
function updateUseModal(packageInfo) {
const {
title, // 标题
contents, // 升级内容
is_mandatory, // 是否强制更新
url, // 安装包下载地址
platform, // 安装包平台
type // 安装包类型
} = packageInfo;
let isWGT = type === 'wgt'
let isiOS = !isWGT ? platform.includes('iOS') : false;
let confirmText = isiOS ? '立即跳转更新' : '立即下载更新'
return uni.showModal({
title,
content: contents,
showCancel: !is_mandatory,
confirmText,
success: res => {
if (res.cancel) return;
// 安装包下载
if (isiOS) {
plus.runtime.openURL(url);
return;
}
uni.showToast({
title: '后台下载中……',
duration: 1000
});
// wgt 和 安卓下载更新
downloadTask = uni.downloadFile({
url,
success: res => {
if (res.statusCode !== 200) {
console.error('下载安装包失败', err);
return;
}
// 下载好直接安装,下次启动生效
plus.runtime.install(res.tempFilePath, {
force: false
}, () => {
if (is_mandatory) {
//更新完重启app
plus.runtime.restart();
return;
}
uni.showModal({
title: '安装成功是否重启?',
success: res => {
if (res.confirm) {
//更新完重启app
plus.runtime.restart();
}
}
});
}, err => {
uni.showModal({
title: '更新失败',
content: err
.message,
showCancel: false
});
});
}
});
}
});
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册