提交 856c93a3 编写于 作者: D DCloud_LXH

feat(升级中心): 升级至 0.9.0 使用 dialogPage 实现需要 HBuilderX 4.31

上级 ed0c0dca
...@@ -1233,6 +1233,15 @@ ...@@ -1233,6 +1233,15 @@
} }
}, },
// #endif // #endif
// #ifdef APP-ANDROID || APP-IOS
{
"path" : "uni_modules/uni-upgrade-center-app/pages/uni-app-x/upgrade-popup",
"style" :
{
"navigationBarTitleText" : ""
}
},
// #endif
{ {
"path": "pages/tabBar/CSS", "path": "pages/tabBar/CSS",
"style": { "style": {
......
...@@ -39,10 +39,6 @@ ...@@ -39,10 +39,6 @@
</template> </template>
</uni-collapse-item> </uni-collapse-item>
</uni-collapse> </uni-collapse>
<!-- #ifdef UNI-APP-X && APP -->
<uni-upgrade-center-app ref="upgradePopup" @show="upgradePopupShow" @close="upgradePopupClose" />
<!-- #endif -->
</view> </view>
<!-- #ifdef APP --> <!-- #ifdef APP -->
</scroll-view> </scroll-view>
...@@ -80,19 +76,7 @@ ...@@ -80,19 +76,7 @@
} else { } else {
uni.navigateTo({ url }) uni.navigateTo({ url })
} }
},
// #ifdef UNI-APP-X && APP
upgradePopupShow() {
console.log('upgradePopup show');
if (!this.pageHiden) {
uni.hideTabBar()?.catch(_ => { })
}
}
, upgradePopupClose() {
console.log('upgradePopup close');
uni.showTabBar()?.catch(_ => { })
} }
// #endif
}, },
// #ifdef WEB // #ifdef WEB
watch: { watch: {
...@@ -118,11 +102,11 @@ ...@@ -118,11 +102,11 @@
if (res.needAuthorization) { if (res.needAuthorization) {
uni.onPrivacyAuthorizationChange((res) => { uni.onPrivacyAuthorizationChange((res) => {
if (!res.needAuthorization) { if (!res.needAuthorization) {
checkUpdate(this.$refs['upgradePopup'] as UniUpgradeCenterAppComponentPublicInstance) checkUpdate()
} }
}) })
} else { } else {
checkUpdate(this.$refs['upgradePopup'] as UniUpgradeCenterAppComponentPublicInstance) checkUpdate()
} }
} }
}) })
......
## 0.9.0(2024-10-30)
- **重要更新** 在 uni-app x 项目中弃用之前弹窗方案使用[dialogPage](https://doc.dcloud.net.cn/uni-app-x/api/dialog-page.html)实现,需要 `HBuilderX 4.31+`
## 0.8.5(2024-10-26) ## 0.8.5(2024-10-26)
- 优化 去除不必要代码 - 优化 去除不必要代码
## 0.8.4(2024-10-26) ## 0.8.4(2024-10-26)
......
{ {
"id": "uni-upgrade-center-app", "id": "uni-upgrade-center-app",
"displayName": "升级中心 uni-upgrade-center - App", "displayName": "升级中心 uni-upgrade-center - App",
"version": "0.8.5", "version": "0.9.0",
"description": "uni升级中心 - 客户端检查更新", "description": "uni升级中心 - 客户端检查更新",
"keywords": [ "keywords": [
"uniCloud", "uniCloud",
......
<template> <template>
<view v-show="shown" class="mask flex-center"> <view class="mask flex-center">
<view class="content"> <view class="content">
<view class="content-top">
<view class="content-top"> <text class="content-top-text">{{title}}</text>
<text class="content-top-text">{{title}}</text> <image class="content-top-image" mode="widthFix"
<image class="content-top-image" mode="widthFix" src="/uni_modules/uni-upgrade-center-app/static/app/bg_top.png"></image>
src="/uni_modules/uni-upgrade-center-app/static/app/bg_top.png"></image> </view>
</view>
<view class="content-space"></view>
<view class="content-space"></view>
<view class="content-body">
<view class="content-body"> <view class="content-body-title">
<view class="content-body-title"> <text class="text title">{{subTitle}}</text>
<text class="text title">{{subTitle}}</text> <text class="text version">v{{version}}</text>
<text class="text version">v{{version}}</text> </view>
</view> <view class="body">
<view class="body"> <scroll-view class="box-des-scroll" scroll-y="true">
<scroll-view class="box-des-scroll" scroll-y="true"> <text class="text box-des">
<text class="text box-des"> {{contents}}
{{contents}} </text>
</text> </scroll-view>
</scroll-view> </view>
</view> <view class="footer flex-center">
<view class="footer flex-center"> <template v-if="isiOS">
<template v-if="isiOS"> <button class="content-button" style="border: none;color: #fff;" plain @click="jumpToAppStore">
<button class="content-button" style="border: none;color: #fff;" plain @click="jumpToAppStore"> {{downLoadBtnTextiOS}}
{{downLoadBtnTextiOS}} </button>
</button> </template>
</template> <template v-else>
<template v-else> <template v-if="!downloadSuccess">
<template v-if="!downloadSuccess"> <view class="progress-box flex-column" v-if="downloading">
<view class="progress-box flex-column" v-if="downloading"> <progress class="progress" :percent="downLoadPercent" activeColor="#3DA7FF"
<progress class="progress" :percent="downLoadPercent" activeColor="#3DA7FF" :show-info="true" :stroke-width="10" /> :show-info="true" :stroke-width="10" />
<view style="width:100%;display: flex;justify-content: space-around;flex-direction: row;"> <view
<text class="text" style="font-size: 14px;">{{downLoadingText}}</text> style="width:100%;display: flex;justify-content: space-around;flex-direction: row;">
<text class="text" style="font-size: 14px;">({{downloadedSize}}/{{packageFileSize}}M)</text> <text class="text" style="font-size: 14px;">{{downLoadingText}}</text>
</view> <text class="text"
</view> style="font-size: 14px;">({{downloadedSize}}/{{packageFileSize}}M)</text>
</view>
<button v-else class="content-button" @click="updateApp"> </view>
{{downLoadBtnText}}
</button> <button v-else class="content-button" @click="updateApp">
</template> {{downLoadBtnText}}
</button>
<button v-else-if="downloadSuccess && !installed" class="content-button" :loading="installing" :disabled="installing" @click="installPackage"> </template>
{{installing ? '正在安装……' : '下载完成,立即安装'}}
</button> <button v-else-if="downloadSuccess && !installed" class="content-button" :loading="installing"
:disabled="installing" @click="installPackage">
<button v-else-if="installed" class="content-button" @click="installPackage"> {{installing ? '正在安装……' : '下载完成,立即安装'}}
安装未完成,点击安装 </button>
</button>
</template> <button v-else-if="installed" class="content-button" @click="installPackage">
</view> 安装未完成,点击安装
</view> </button>
</template>
<view class="content-bottom"> </view>
<image v-if="!is_mandatory" class="close-img" mode="widthFix" src="/uni_modules/uni-upgrade-center-app/static/app/app_update_close.png" @click="closeUpdate"> </view>
</image>
</view> <view class="content-bottom">
</view> <image v-if="!is_mandatory" class="close-img" mode="widthFix"
</view> src="/uni_modules/uni-upgrade-center-app/static/app/app_update_close.png" @click="closeUpdate">
</template> </image>
</view>
<script> </view>
import { openSchema as utsOpenSchema } from '@/uni_modules/uts-openSchema' </view>
import { createNotificationProgress, cancelNotificationProgress, finishNotificationProgress } from '@/uni_modules/uts-progressNotification' </template>
import { type CreateNotificationProgressOptions, type FinishNotificationProgressOptions } from '@/uni_modules/uts-progressNotification/utssdk/interface.uts'
import { UniUpgradeCenterResult, StoreListItem } from '../../utils/call-check-version' <script>
import { openSchema as utsOpenSchema } from '@/uni_modules/uts-openSchema'
const platform_iOS = 'iOS'; import { createNotificationProgress, cancelNotificationProgress, finishNotificationProgress } from '@/uni_modules/uts-progressNotification'
const platform_Android = 'Android'; import { type CreateNotificationProgressOptions, type FinishNotificationProgressOptions } from '@/uni_modules/uts-progressNotification/utssdk/interface.uts'
const requiredKey = ['version', 'url', 'type'] import { UniUpgradeCenterResult, StoreListItem } from '../../utils/call-check-version'
let downloadTask : DownloadTask | null = null; const platform_iOS = 'iOS';
let openSchemePromise: Promise<boolean> | null = null; const platform_Android = 'Android';
const requiredKey = ['version', 'url', 'type']
const openSchema = (url: string): Promise<boolean> => new Promise<boolean>((resolve,reject) =>{ let downloadTask : DownloadTask | null = null;
try{ let openSchemePromise : Promise<boolean> | null = null;
utsOpenSchema(url)
resolve(true) const openSchema = (url : string) : Promise<boolean> => new Promise<boolean>((resolve, reject) => {
}catch(e){ try {
reject(false) utsOpenSchema(url)
} resolve(true)
}) } catch (e) {
reject(false)
export default { }
emits: ['close', 'show'], })
data() {
return { export default {
shown: false, data() {
// 从之前下载安装 return {
installForBeforeFilePath: '', // 从之前下载安装
installForBeforeFilePath: '',
// 安装
installed: false, // 安装
installing: false, installed: false,
installing: false,
// 下载
downloadSuccess: false, // 下载
downloading: false, downloadSuccess: false,
downloading: false,
downLoadPercent: 0,
downloadedSize: 0, downLoadPercent: 0,
packageFileSize: 0, downloadedSize: 0,
packageFileSize: 0,
tempFilePath: '', // 要安装的本地包地址
tempFilePath: '', // 要安装的本地包地址
// 默认安装包信息
title: '更新日志', // 默认安装包信息
contents: '', title: '更新日志',
version: '', contents: '',
is_mandatory: false, version: '',
url: "", is_mandatory: false,
platform: [] as string[], url: "",
store_list: null as StoreListItem[] | null, platform: [] as string[],
store_list: null as StoreListItem[] | null,
// 可自定义属性
subTitle: '发现新版本', // 可自定义属性
downLoadBtnTextiOS: '立即跳转更新', subTitle: '发现新版本',
downLoadBtnText: '立即下载更新', downLoadBtnTextiOS: '立即跳转更新',
downLoadingText: '安装包下载中,请稍后' downLoadBtnText: '立即下载更新',
downLoadingText: '安装包下载中,请稍后'
}
},
computed: {
isiOS() : boolean {
return this.platform.includes(platform_iOS);
},
isAndroid() : boolean {
return this.platform.includes(platform_Android);
},
needNotificationProgress() : boolean {
return this.isAndroid && !this.is_mandatory
}
},
onUnload() {
if (this.needNotificationProgress) {
cancelNotificationProgress()
}
},
onLoad(onLoadOptions: OnLoadOptions) {
const local_storage_key: string | null = onLoadOptions['local_storage_key']
if (local_storage_key == null) {
console.error('local_storage_key为空,请检查后重试')
this.closePopup()
return;
};
const localPackageInfo = uni.getStorageSync(local_storage_key);
if (localPackageInfo == null) {
console.error('安装包信息为空,请检查后重试')
this.closePopup()
return;
};
this.show(JSON.parse<UniUpgradeCenterResult>(JSON.stringify(localPackageInfo)) as UniUpgradeCenterResult)
},
onBackPress(options : OnBackPressOptions) : boolean | null {
if (this.is_mandatory) return true
if (!this.needNotificationProgress) {
if (downloadTask !== null) {
downloadTask!.abort()
}
} }
}, return false
computed: { },
isiOS() : boolean { methods: {
return this.platform.includes(platform_iOS); jumpToAppStore() {
}, openSchema(this.url)
isAndroid() : boolean { },
return this.platform.includes(platform_Android); show(localPackageInfo : UniUpgradeCenterResult | null) {
}, if (localPackageInfo === null) return;
needNotificationProgress(): boolean {
return this.isAndroid && !this.is_mandatory for (let key in localPackageInfo) {
} if (requiredKey.indexOf(key) != -1 && localPackageInfo[key] === null) {
}, console.error(`参数 ${key} 必填,请检查后重试`)
beforeUnmount() { this.closePopup()
if (this.needNotificationProgress) { return;
cancelNotificationProgress() }
} }
},
methods: { this.title = localPackageInfo.title
jumpToAppStore() { this.url = localPackageInfo.url
openSchema(this.url) this.contents = localPackageInfo.contents
}, this.is_mandatory = localPackageInfo.is_mandatory
show(shown : boolean, localPackageInfo : UniUpgradeCenterResult | null) { this.platform = localPackageInfo.platform
if (localPackageInfo === null) return; this.version = localPackageInfo.version
this.store_list = localPackageInfo.store_list
for (let key in localPackageInfo) { },
if (requiredKey.indexOf(key) != -1 && localPackageInfo[key] === null) { askAbortDownload() {
console.error(`参数 ${key} 必填,请检查后重试`) uni.showModal({
uni.navigateBack() title: '是否取消下载?',
return; cancelText: '否',
} confirmText: '是',
} success: res => {
if (res.confirm) {
this.title = localPackageInfo.title if (downloadTask !== null) downloadTask!.abort()
this.url = localPackageInfo.url this.closePopup()
this.contents = localPackageInfo.contents }
this.is_mandatory = localPackageInfo.is_mandatory }
this.platform = localPackageInfo.platform });
this.version = localPackageInfo.version },
this.store_list = localPackageInfo.store_list closeUpdate() {
this.shown = shown if (this.downloading && !this.needNotificationProgress) {
this.askAbortDownload()
this.$emit('show') return;
}, }
askAbortDownload() {
uni.showModal({ this.closePopup()
title: '是否取消下载?', },
cancelText: '否', closePopup() {
confirmText: '是', this.downloadSuccess = false
success: res => { this.downloading = false
if (res.confirm) { this.downLoadPercent = 0
if (downloadTask !== null) downloadTask!.abort() this.downloadedSize = 0
this.closePopup() this.packageFileSize = 0
} this.tempFilePath = ''
}
}); this.installing = false
}, this.installed = false
closeUpdate() {
if (this.downloading) { uni.closeDialogPage({
if (this.is_mandatory) { dialogPage: this.$page
return uni.showToast({ })
title: '下载中,请稍后……', },
icon: 'none', updateApp() {
duration: 500 const checkStoreScheme = this.checkStoreScheme()
}) if (checkStoreScheme !== null) {
} checkStoreScheme
if (!this.needNotificationProgress) { .then(_ => { })
this.askAbortDownload() .catch(() => { this.downloadPackage() })
return; .finally(() => {
} openSchemePromise = null
} })
this.closePopup() } else { this.downloadPackage() }
}, },
closePopup() { // 跳转应用商店
this.shown = false checkStoreScheme() : Promise<boolean> | null {
this.downloadSuccess = false if (this.store_list !== null) {
this.downloading = false const storeList : StoreListItem[] = this.store_list!.filter((item : StoreListItem) : boolean => item.enable)
this.downLoadPercent = 0 if (storeList.length > 0) {
this.downloadedSize = 0 if (openSchemePromise === null) {
this.packageFileSize = 0 openSchemePromise = Promise.reject() as Promise<boolean>
this.tempFilePath = '' }
storeList
this.installing = false .sort((cur : StoreListItem, next : StoreListItem) : number => next.priority - cur.priority)
this.installed = false .map((item : StoreListItem) : string => item.scheme)
.reduce((promise : Promise<boolean>, cur : string) : Promise<boolean> => {
if (this.needNotificationProgress) cancelNotificationProgress() openSchemePromise = promise.catch<boolean>(() : Promise<boolean> => openSchema(cur))
this.$emit('close') return openSchemePromise!
}, }, openSchemePromise!)
updateApp() { return openSchemePromise!
const checkStoreScheme = this.checkStoreScheme() }
if (checkStoreScheme !== null) { }
checkStoreScheme
.then(_ => { }) return null
.catch(() => { this.downloadPackage() }) },
.finally(() => { downloadPackage() {
openSchemePromise = null //下载包
}) downloadTask = uni.downloadFile({
} else { this.downloadPackage() } url: this.url,
}, success: res => {
// 跳转应用商店 if (res.statusCode == 200) {
checkStoreScheme(): Promise<boolean> | null { this.tempFilePath = res.tempFilePath
if (this.store_list !== null) { this.downLoadComplete()
const storeList: StoreListItem[] = this.store_list!.filter((item: StoreListItem): boolean => item.enable) }
if (storeList.length > 0) { },
if (openSchemePromise === null) { fail: err => {
openSchemePromise = Promise.reject() as Promise<boolean> console.log('downloadFile err: ', err);
} }
storeList });
.sort((cur: StoreListItem, next: StoreListItem): number => next.priority - cur.priority) if (downloadTask !== null) {
.map((item: StoreListItem): string => item.scheme) this.downloading = true;
.reduce((promise: Promise<boolean>, cur: string): Promise<boolean> => { if (this.needNotificationProgress) {
openSchemePromise = promise.catch<boolean>((): Promise<boolean> => openSchema(cur)) this.closePopup()
return openSchemePromise! }
}, openSchemePromise!) downloadTask!.onProgressUpdate(res => {
return openSchemePromise! this.downLoadPercent = parseFloat(res.progress.toFixed(0));
} this.downloadedSize = parseFloat((res.totalBytesWritten / Math.pow(1024, 2)).toFixed(2));
} this.packageFileSize = parseFloat((res.totalBytesExpectedToWrite / Math.pow(1024, 2)).toFixed(2));
return null if (this.needNotificationProgress) {
}, createNotificationProgress({
downloadPackage() { title: "升级中心正在下载安装包……",
//下载包 content: `${this.downLoadPercent}%`,
downloadTask = uni.downloadFile({ progress: this.downLoadPercent,
url: this.url, onClick: () => {
success: res => { if (!this.downloadSuccess) {
if (res.statusCode == 200) { this.askAbortDownload()
this.tempFilePath = res.tempFilePath }
this.downLoadComplete() }
} } as CreateNotificationProgressOptions)
}, }
fail: err => { });
console.log('downloadFile err: ', err); }
} },
}); downLoadComplete() {
if (downloadTask !== null) { this.downloadSuccess = true;
this.downloading = true; this.downloading = false;
if (this.needNotificationProgress) {
this.closePopup() this.downLoadPercent = 0
} this.downloadedSize = 0
downloadTask!.onProgressUpdate(res => { this.packageFileSize = 0
this.downLoadPercent = parseFloat(res.progress.toFixed(0));
this.downloadedSize = parseFloat((res.totalBytesWritten / Math.pow(1024, 2)).toFixed(2)); downloadTask = null;
this.packageFileSize = parseFloat((res.totalBytesExpectedToWrite / Math.pow(1024, 2)).toFixed(2));
if (this.needNotificationProgress) {
if (this.needNotificationProgress) { finishNotificationProgress({
createNotificationProgress({ title: "安装升级包",
title: "升级中心正在下载安装包……", content: "下载完成",
content: `${this.downLoadPercent}%`, onClick() { }
progress: this.downLoadPercent, } as FinishNotificationProgressOptions)
onClick: () => {
if (!this.downloadSuccess) { this.installPackage();
this.askAbortDownload() return
} }
}
} as CreateNotificationProgressOptions) // 强制更新,直接安装
} if (this.is_mandatory) {
}); this.installPackage();
} }
}, },
downLoadComplete() { installPackage() {
this.downloadSuccess = true; this.installing = true;
this.downloading = false; // #ifdef APP
uni.installApk({
this.downLoadPercent = 0 filePath: this.tempFilePath,
this.downloadedSize = 0 success: _ => {
this.packageFileSize = 0 this.installing = false;
this.installed = true;
downloadTask = null; },
fail: err => {
if (this.needNotificationProgress) { console.error('installApk fail', err);
finishNotificationProgress({ // 安装失败需要重新下载安装包
title: "安装升级包", this.installing = false;
content: "下载完成", this.installed = false;
onClick(){}
} as FinishNotificationProgressOptions) uni.showModal({
title: '更新失败,请重新下载',
this.installPackage(); content: `uni.installApk 错误码 ${err.errCode}`,
return showCancel: false
} });
}
// 强制更新,直接安装 });
if (this.is_mandatory) {
this.installPackage(); // 安装跳出覆盖安装,此处直接返回上一页
} if (!this.is_mandatory) {
}, uni.navigateBack()
installPackage() { }
this.installing = true; // #endif
// #ifdef APP }
uni.installApk({ }
filePath: this.tempFilePath, }
success: _ => { </script>
console.log('installApk success');
this.installing = false; <style>
this.installed = true; .flex-center {
}, /* #ifndef APP-NVUE | UNI-APP-X */
fail: err => { display: flex;
console.error('installApk fail', err); /* #endif */
// 安装失败需要重新下载安装包 justify-content: center;
this.installing = false; align-items: center;
this.installed = false; }
uni.showModal({ .mask {
title: '更新失败,请重新下载', position: fixed;
content: `uni.installApk 错误码 ${err.errCode}`, left: 0;
showCancel: false top: 0;
}); right: 0;
} bottom: 0;
}); background-color: rgba(0, 0, 0, .65);
}
// 安装跳出覆盖安装,此处直接返回上一页
if (!this.is_mandatory) { .content {
uni.navigateBack() position: relative;
} top: 0;
// #endif width: 600rpx;
} background-color: transparent;
} }
}
</script> .text {
font-family: Source Han Sans CN;
<style> }
.flex-center {
/* #ifndef APP-NVUE | UNI-APP-X */ .content-top {
display: flex; width: 100%;
/* #endif */ border-bottom-color: #fff;
justify-content: center; border-bottom-width: 15px;
align-items: center; border-bottom-style: solid;
} }
.mask { .content-space {
position: fixed; width: 100%;
left: 0; height: 50px;
top: 0; background-color: #fff;
right: 0; position: absolute;
bottom: 0; top: 140px;
background-color: rgba(0, 0, 0, .65); z-index: -1;
} }
.content { .content-top-image {
position: relative; width: 100%;
top: 0; position: relative;
width: 600rpx; bottom: -18px;
background-color: transparent; }
}
.content-top-text {
.text { font-size: 22px;
font-family: Source Han Sans CN; font-weight: bold;
} color: #F8F8FA;
position: absolute;
.content-top { width: 65%;
width: 100%; top: 77.5px;
border-bottom-color: #fff; left: 25px;
border-bottom-width: 15px; z-index: 1;
border-bottom-style: solid; }
}
.content-body {
.content-space { box-sizing: border-box;
width: 100%; padding: 0 25px;
height: 50px; width: 100%;
background-color: #fff; background-color: #fff;
position: absolute; border-bottom-left-radius: 15px;
top: 140px; border-bottom-right-radius: 15px;
z-index: -1; }
}
.content-body-title {
.content-top-image { flex-direction: row;
width: 100%; align-items: center;
position: relative; }
bottom: -18px;
} .content-body-title .version {
padding-left: 10px;
.content-top-text { color: #fff;
font-size: 22px; font-size: 10px;
font-weight: bold; margin-left: 5px;
color: #F8F8FA; padding: 2px 4px;
position: absolute; border-radius: 10px;
width: 65%; background: #50aefd;
top: 77.5px; }
left: 25px;
z-index: 1; .title {
} font-size: 16px;
font-weight: bold;
.content-body { color: #3DA7FF;
box-sizing: border-box; line-height: 38px;
padding: 0 25px; }
width: 100%;
background-color: #fff; .footer {
border-bottom-left-radius: 15px; height: 75px;
border-bottom-right-radius: 15px; display: flex;
} align-items: center;
justify-content: space-around;
.content-body-title { }
flex-direction: row;
align-items: center; .box-des-scroll {
} box-sizing: border-box;
padding: 0 15px;
.content-body-title .version { height: 100px;
padding-left: 10px; }
color: #fff;
font-size: 10px; .box-des {
margin-left: 5px; font-size: 13px;
padding: 2px 4px; color: #000000;
border-radius: 10px; line-height: 25px;
background: #50aefd; }
}
.progress-box {
.title { width: 100%;
font-size: 16px; }
font-weight: bold;
color: #3DA7FF; .progress {
line-height: 38px; width: 90%;
} height: 20px;
}
.footer {
height: 75px; .content-bottom {
display: flex; height: 75px;
align-items: center; }
justify-content: space-around;
} .close-img {
width: 35px;
.box-des-scroll { height: 35px;
box-sizing: border-box; z-index: 1000;
padding: 0 15px; position: relative;
height: 100px; bottom: -25px;
} left: 132px;
}
.box-des {
font-size: 13px; .content-button {
color: #000000; width: 100%;
line-height: 25px; height: 40px;
} line-height: 40px;
.progress-box { font-size: 15px;
width: 100%; font-weight: 400;
} border-radius: 20px;
border: none;
.progress { color: #fff;
width: 90%;
height: 20px; text-align: center;
}
background-color: #1785ff;
.content-bottom { }
height: 75px;
} .flex-column {
display: flex;
.close-img { flex-direction: column;
width: 35px; align-items: center;
height: 35px; }
z-index: 1000; </style>
position: relative; \ No newline at end of file
bottom: -25px;
left: 132px;
}
.content-button {
width: 100%;
height: 40px;
line-height: 40px;
font-size: 15px;
font-weight: 400;
border-radius: 20px;
border: none;
color: #fff;
text-align: center;
background-color: #1785ff;
}
.flex-column {
display: flex;
flex-direction: column;
align-items: center;
}
</style>
...@@ -26,7 +26,7 @@ export type UniUpgradeCenterResult = { ...@@ -26,7 +26,7 @@ export type UniUpgradeCenterResult = {
type : string // "native_app" | "wgt" type : string // "native_app" | "wgt"
store_list : StoreListItem[] | null store_list : StoreListItem[] | null
min_uni_version : string | null // 升级 wgt 的最低 uni-app 版本 min_uni_version : string | null // 升级 wgt 的最低 uni-app 版本
} }
export default function () : Promise<UniUpgradeCenterResult> { export default function () : Promise<UniUpgradeCenterResult> {
...@@ -80,20 +80,20 @@ export default function () : Promise<UniUpgradeCenterResult> { ...@@ -80,20 +80,20 @@ export default function () : Promise<UniUpgradeCenterResult> {
const code = res.result['code'] const code = res.result['code']
const codeIsNumber = ['Int', 'Long', 'number'].includes(typeof code) const codeIsNumber = ['Int', 'Long', 'number'].includes(typeof code)
if (codeIsNumber) { if (codeIsNumber) {
if ((code as number) == 0) { if ((code as number) == 0) {
reject({ reject({
code: res.result['code'], code: res.result['code'],
message: res.result['message'] message: res.result['message']
}) })
} else if ((code as number) < 0) { } else if ((code as number) < 0) {
reject({ reject({
code: res.result['code'], code: res.result['code'],
message: res.result['message'] message: res.result['message']
}) })
} else { } else {
const result = JSON.parse<UniUpgradeCenterResult>(JSON.stringify(res.result)) as UniUpgradeCenterResult const result = JSON.parse<UniUpgradeCenterResult>(JSON.stringify(res.result)) as UniUpgradeCenterResult
resolve(result) resolve(result)
} }
} }
}).catch<void>((err : any | null) => { }).catch<void>((err : any | null) => {
const error = err as UniCloudError const error = err as UniCloudError
......
...@@ -6,13 +6,7 @@ import { openSchema } from '@/uni_modules/uts-openSchema' ...@@ -6,13 +6,7 @@ import { openSchema } from '@/uni_modules/uts-openSchema'
// 推荐再App.vue中使用 // 推荐再App.vue中使用
const PACKAGE_INFO_KEY = '__package_info__' const PACKAGE_INFO_KEY = '__package_info__'
// uni-app 项目无法从 vue 中导出 ComponentPublicInstance 类型,故使用条件编译
// #ifdef UNI-APP-X
export default function (component : ComponentPublicInstance | null = null) : Promise<UniUpgradeCenterResult> {
// #endif
// #ifndef UNI-APP-X
export default function () : Promise<UniUpgradeCenterResult> { export default function () : Promise<UniUpgradeCenterResult> {
// #endif
return new Promise<UniUpgradeCenterResult>((resolve, reject) => { return new Promise<UniUpgradeCenterResult>((resolve, reject) => {
callCheckVersion().then(async (uniUpgradeCenterResult) => { callCheckVersion().then(async (uniUpgradeCenterResult) => {
// NOTE uni-app x 3.96 解构有问题 // NOTE uni-app x 3.96 解构有问题
...@@ -20,65 +14,72 @@ export default function () : Promise<UniUpgradeCenterResult> { ...@@ -20,65 +14,72 @@ export default function () : Promise<UniUpgradeCenterResult> {
const message = uniUpgradeCenterResult.message const message = uniUpgradeCenterResult.message
const url = uniUpgradeCenterResult.url // 安装包下载地址 const url = uniUpgradeCenterResult.url // 安装包下载地址
// 此处逻辑仅为示例,可自行编写 // 此处逻辑仅为示例,可自行编写
if (code > 0) { if (code > 0) {
// 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回 // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
const tcbRes = await uniCloud.getTempFileURL({ fileList: [url] }); const tcbRes = await uniCloud.getTempFileURL({ fileList: [url] });
if (typeof tcbRes.fileList[0].tempFileURL !== 'undefined') uniUpgradeCenterResult.url = tcbRes.fileList[0].tempFileURL; if (typeof tcbRes.fileList[0].tempFileURL !== 'undefined') uniUpgradeCenterResult.url = tcbRes.fileList[0].tempFileURL;
/** /**
* 提示升级一 * 提示升级一
* 使用 uni.showModal * 使用 uni.showModal
*/ */
// return updateUseModal(uniUpgradeCenterResult) // return updateUseModal(uniUpgradeCenterResult)
// #ifndef UNI-APP-X // #ifndef UNI-APP-X
// 静默更新,只有wgt有 // 静默更新,只有wgt有
if (uniUpgradeCenterResult.is_silently) { if (uniUpgradeCenterResult.is_silently) {
uni.downloadFile({ uni.downloadFile({
url, url,
success: res => { success: res => {
if (res.statusCode == 200) { if (res.statusCode == 200) {
// 下载好直接安装,下次启动生效 // 下载好直接安装,下次启动生效
plus.runtime.install(res.tempFilePath, { plus.runtime.install(res.tempFilePath, {
force: false force: false
}); });
} }
} }
}); });
return; return;
} }
// #endif // #endif
/** /**
* 提示升级二 * 提示升级二
* 官方适配的升级弹窗,可自行替换资源适配UI风格 * 官方适配的升级弹窗,可自行替换资源适配UI风格
*/ */
// #ifndef UNI-APP-X uni.setStorageSync(PACKAGE_INFO_KEY, uniUpgradeCenterResult)
uni.setStorageSync(PACKAGE_INFO_KEY, uniUpgradeCenterResult) // #ifndef UNI-APP-X
uni.navigateTo({ uni.navigateTo({
url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`, url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`,
fail: (err) => { fail: (err) => {
console.error('更新弹框跳转失败', err) console.error('更新弹框跳转失败', err)
uni.removeStorageSync(PACKAGE_INFO_KEY) uni.removeStorageSync(PACKAGE_INFO_KEY)
} }
})
// #endif
// #ifdef UNI-APP-X
uni.openDialogPage({
url: `/uni_modules/uni-upgrade-center-app/pages/uni-app-x/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`,
disableEscBack: true,
fail: (err) => {
console.error('更新弹框跳转失败', err)
uni.removeStorageSync(PACKAGE_INFO_KEY)
}
}) })
// #endif // #endif
// #ifdef UNI-APP-X
component?.$callMethod('show', true, uniUpgradeCenterResult)
// #endif
return resolve(uniUpgradeCenterResult) return resolve(uniUpgradeCenterResult)
} else if (code < 0) { } else if (code < 0) {
console.error(message) console.error(message)
return reject(uniUpgradeCenterResult) return reject(uniUpgradeCenterResult)
} }
return resolve(uniUpgradeCenterResult) return resolve(uniUpgradeCenterResult)
}).catch((err) => { }).catch((err) => {
reject(err) reject(err)
}) })
}); });
} }
/** /**
* 使用 uni.showModal 升级 * 使用 uni.showModal 升级
...@@ -104,13 +105,13 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { ...@@ -104,13 +105,13 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void {
let confirmText = '立即下载更新' let confirmText = '立即下载更新'
// #endif // #endif
return uni.showModal({ return uni.showModal({
title, title,
content: contents, content: contents,
showCancel: !is_mandatory, showCancel: !is_mandatory,
confirmText, confirmText,
success: res => { success: res => {
if (res.cancel) return; if (res.cancel) return;
if (isiOS) { if (isiOS) {
// iOS 平台跳转 AppStore // iOS 平台跳转 AppStore
...@@ -123,10 +124,10 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { ...@@ -123,10 +124,10 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void {
return; return;
} }
uni.showToast({ uni.showToast({
title: '后台下载中……', title: '后台下载中……',
duration: 1000 duration: 1000
}); });
// wgt 和 安卓下载更新 // wgt 和 安卓下载更新
uni.downloadFile({ uni.downloadFile({
...@@ -137,7 +138,7 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { ...@@ -137,7 +138,7 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void {
return; return;
} }
// 下载好直接安装,下次启动生效 // 下载好直接安装,下次启动生效
// uni-app x 项目没有 plus5+ 故使用条件编译 // uni-app x 项目没有 plus5+ 故使用条件编译
// #ifndef UNI-APP-X // #ifndef UNI-APP-X
plus.runtime.install(res.tempFilePath, { plus.runtime.install(res.tempFilePath, {
force: false force: false
...@@ -166,23 +167,23 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { ...@@ -166,23 +167,23 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void {
}); });
// #endif // #endif
// #ifdef UNI-APP-X // #ifdef UNI-APP-X
uni.installApk({ uni.installApk({
filePath: res.tempFilePath, filePath: res.tempFilePath,
success: () => { success: () => {
uni.showModal({ uni.showModal({
title: '安装成功请手动重启' title: '安装成功请手动重启'
}); });
}, },
fail: err => { fail: err => {
uni.showModal({ uni.showModal({
title: '更新失败', title: '更新失败',
content: err.errMsg, content: err.errMsg,
showCancel: false showCancel: false
}); });
} }
}); });
// #endif // #endif
} }
}); });
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册