From a0394b8b3ed1f454ea8f1cc0da288f129259e5f6 Mon Sep 17 00:00:00 2001 From: DCloud_LXH <283700113@qq.com> Date: Wed, 30 Oct 2024 15:22:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=8D=87=E7=BA=A7=E4=B8=AD=E5=BF=83):=20?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B3=200.9.0=20=E4=BD=BF=E7=94=A8=20dial?= =?UTF-8?q?ogPage=20=E5=AE=9E=E7=8E=B0=E9=9C=80=E8=A6=81=20HBuilderX=204.3?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages.json | 9 + pages/tabBar/component.uvue | 20 +- .../uni-upgrade-center-app/changelog.md | 2 + .../uni-upgrade-center-app/package.json | 2 +- .../uni-app-x/upgrade-popup.uvue} | 1005 +++++++++-------- .../utils/call-check-version.ts | 30 +- .../utils/check-update.ts | 179 +-- 7 files changed, 629 insertions(+), 618 deletions(-) rename uni_modules/uni-upgrade-center-app/{components/uni-upgrade-center-app/uni-upgrade-center-app.uvue => pages/uni-app-x/upgrade-popup.uvue} (60%) diff --git a/pages.json b/pages.json index 75a12f70..798f570b 100644 --- a/pages.json +++ b/pages.json @@ -1259,6 +1259,15 @@ } }, // #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", "style": { diff --git a/pages/tabBar/component.uvue b/pages/tabBar/component.uvue index c9fb5906..c694b947 100644 --- a/pages/tabBar/component.uvue +++ b/pages/tabBar/component.uvue @@ -39,10 +39,6 @@ - - - - @@ -80,19 +76,7 @@ } else { 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 watch: { @@ -118,11 +102,11 @@ if (res.needAuthorization) { uni.onPrivacyAuthorizationChange((res) => { if (!res.needAuthorization) { - checkUpdate(this.$refs['upgradePopup'] as UniUpgradeCenterAppComponentPublicInstance) + checkUpdate() } }) } else { - checkUpdate(this.$refs['upgradePopup'] as UniUpgradeCenterAppComponentPublicInstance) + checkUpdate() } } }) diff --git a/uni_modules/uni-upgrade-center-app/changelog.md b/uni_modules/uni-upgrade-center-app/changelog.md index 01dd25b9..2e87e675 100644 --- a/uni_modules/uni-upgrade-center-app/changelog.md +++ b/uni_modules/uni-upgrade-center-app/changelog.md @@ -1,3 +1,5 @@ +## 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.4(2024-10-26) diff --git a/uni_modules/uni-upgrade-center-app/package.json b/uni_modules/uni-upgrade-center-app/package.json index 76546380..65dabb1e 100644 --- a/uni_modules/uni-upgrade-center-app/package.json +++ b/uni_modules/uni-upgrade-center-app/package.json @@ -1,7 +1,7 @@ { "id": "uni-upgrade-center-app", "displayName": "升级中心 uni-upgrade-center - App", - "version": "0.8.5", + "version": "0.9.0", "description": "uni升级中心 - 客户端检查更新", "keywords": [ "uniCloud", diff --git a/uni_modules/uni-upgrade-center-app/components/uni-upgrade-center-app/uni-upgrade-center-app.uvue b/uni_modules/uni-upgrade-center-app/pages/uni-app-x/upgrade-popup.uvue similarity index 60% rename from uni_modules/uni-upgrade-center-app/components/uni-upgrade-center-app/uni-upgrade-center-app.uvue rename to uni_modules/uni-upgrade-center-app/pages/uni-app-x/upgrade-popup.uvue index 76b1ffe5..319362fa 100644 --- a/uni_modules/uni-upgrade-center-app/components/uni-upgrade-center-app/uni-upgrade-center-app.uvue +++ b/uni_modules/uni-upgrade-center-app/pages/uni-app-x/upgrade-popup.uvue @@ -1,496 +1,511 @@ - - - - - + return false + }, + methods: { + jumpToAppStore() { + openSchema(this.url) + }, + show(localPackageInfo : UniUpgradeCenterResult | null) { + if (localPackageInfo === null) return; + + for (let key in localPackageInfo) { + if (requiredKey.indexOf(key) != -1 && localPackageInfo[key] === null) { + console.error(`参数 ${key} 必填,请检查后重试`) + this.closePopup() + return; + } + } + + this.title = localPackageInfo.title + this.url = localPackageInfo.url + this.contents = localPackageInfo.contents + this.is_mandatory = localPackageInfo.is_mandatory + this.platform = localPackageInfo.platform + this.version = localPackageInfo.version + this.store_list = localPackageInfo.store_list + }, + askAbortDownload() { + uni.showModal({ + title: '是否取消下载?', + cancelText: '否', + confirmText: '是', + success: res => { + if (res.confirm) { + if (downloadTask !== null) downloadTask!.abort() + this.closePopup() + } + } + }); + }, + closeUpdate() { + if (this.downloading && !this.needNotificationProgress) { + this.askAbortDownload() + return; + } + + this.closePopup() + }, + closePopup() { + this.downloadSuccess = false + this.downloading = false + this.downLoadPercent = 0 + this.downloadedSize = 0 + this.packageFileSize = 0 + this.tempFilePath = '' + + this.installing = false + this.installed = false + + uni.closeDialogPage({ + dialogPage: this.$page + }) + }, + updateApp() { + const checkStoreScheme = this.checkStoreScheme() + if (checkStoreScheme !== null) { + checkStoreScheme + .then(_ => { }) + .catch(() => { this.downloadPackage() }) + .finally(() => { + openSchemePromise = null + }) + } else { this.downloadPackage() } + }, + // 跳转应用商店 + checkStoreScheme() : Promise | null { + if (this.store_list !== null) { + const storeList : StoreListItem[] = this.store_list!.filter((item : StoreListItem) : boolean => item.enable) + if (storeList.length > 0) { + if (openSchemePromise === null) { + openSchemePromise = Promise.reject() as Promise + } + storeList + .sort((cur : StoreListItem, next : StoreListItem) : number => next.priority - cur.priority) + .map((item : StoreListItem) : string => item.scheme) + .reduce((promise : Promise, cur : string) : Promise => { + openSchemePromise = promise.catch(() : Promise => openSchema(cur)) + return openSchemePromise! + }, openSchemePromise!) + return openSchemePromise! + } + } + + return null + }, + downloadPackage() { + //下载包 + downloadTask = uni.downloadFile({ + url: this.url, + success: res => { + if (res.statusCode == 200) { + this.tempFilePath = res.tempFilePath + this.downLoadComplete() + } + }, + fail: err => { + console.log('downloadFile err: ', err); + } + }); + if (downloadTask !== null) { + this.downloading = true; + if (this.needNotificationProgress) { + this.closePopup() + } + downloadTask!.onProgressUpdate(res => { + 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)); + + if (this.needNotificationProgress) { + createNotificationProgress({ + title: "升级中心正在下载安装包……", + content: `${this.downLoadPercent}%`, + progress: this.downLoadPercent, + onClick: () => { + if (!this.downloadSuccess) { + this.askAbortDownload() + } + } + } as CreateNotificationProgressOptions) + } + }); + } + }, + downLoadComplete() { + this.downloadSuccess = true; + this.downloading = false; + + this.downLoadPercent = 0 + this.downloadedSize = 0 + this.packageFileSize = 0 + + downloadTask = null; + + if (this.needNotificationProgress) { + finishNotificationProgress({ + title: "安装升级包", + content: "下载完成", + onClick() { } + } as FinishNotificationProgressOptions) + + this.installPackage(); + return + } + + // 强制更新,直接安装 + if (this.is_mandatory) { + this.installPackage(); + } + }, + installPackage() { + this.installing = true; + // #ifdef APP + uni.installApk({ + filePath: this.tempFilePath, + success: _ => { + this.installing = false; + this.installed = true; + }, + fail: err => { + console.error('installApk fail', err); + // 安装失败需要重新下载安装包 + this.installing = false; + this.installed = false; + + uni.showModal({ + title: '更新失败,请重新下载', + content: `uni.installApk 错误码 ${err.errCode}`, + showCancel: false + }); + } + }); + + // 安装跳出覆盖安装,此处直接返回上一页 + if (!this.is_mandatory) { + uni.navigateBack() + } + // #endif + } + } + } + + + \ No newline at end of file diff --git a/uni_modules/uni-upgrade-center-app/utils/call-check-version.ts b/uni_modules/uni-upgrade-center-app/utils/call-check-version.ts index 4a0af00f..877d62a9 100644 --- a/uni_modules/uni-upgrade-center-app/utils/call-check-version.ts +++ b/uni_modules/uni-upgrade-center-app/utils/call-check-version.ts @@ -26,7 +26,7 @@ export type UniUpgradeCenterResult = { type : string // "native_app" | "wgt" store_list : StoreListItem[] | null - min_uni_version : string | null // 升级 wgt 的最低 uni-app 版本 + min_uni_version : string | null // 升级 wgt 的最低 uni-app 版本 } export default function () : Promise { @@ -80,20 +80,20 @@ export default function () : Promise { const code = res.result['code'] const codeIsNumber = ['Int', 'Long', 'number'].includes(typeof code) if (codeIsNumber) { - if ((code as number) == 0) { - reject({ - code: res.result['code'], - message: res.result['message'] - }) - } else if ((code as number) < 0) { - reject({ - code: res.result['code'], - message: res.result['message'] - }) - } else { - const result = JSON.parse(JSON.stringify(res.result)) as UniUpgradeCenterResult - resolve(result) - } + if ((code as number) == 0) { + reject({ + code: res.result['code'], + message: res.result['message'] + }) + } else if ((code as number) < 0) { + reject({ + code: res.result['code'], + message: res.result['message'] + }) + } else { + const result = JSON.parse(JSON.stringify(res.result)) as UniUpgradeCenterResult + resolve(result) + } } }).catch((err : any | null) => { const error = err as UniCloudError diff --git a/uni_modules/uni-upgrade-center-app/utils/check-update.ts b/uni_modules/uni-upgrade-center-app/utils/check-update.ts index d8ecf2d2..81757dba 100644 --- a/uni_modules/uni-upgrade-center-app/utils/check-update.ts +++ b/uni_modules/uni-upgrade-center-app/utils/check-update.ts @@ -6,13 +6,7 @@ import { openSchema } from '@/uni_modules/uts-openSchema' // 推荐再App.vue中使用 const PACKAGE_INFO_KEY = '__package_info__' -// uni-app 项目无法从 vue 中导出 ComponentPublicInstance 类型,故使用条件编译 -// #ifdef UNI-APP-X -export default function (component : ComponentPublicInstance | null = null) : Promise { -// #endif -// #ifndef UNI-APP-X export default function () : Promise { -// #endif return new Promise((resolve, reject) => { callCheckVersion().then(async (uniUpgradeCenterResult) => { // NOTE uni-app x 3.96 解构有问题 @@ -20,65 +14,72 @@ export default function () : Promise { const message = uniUpgradeCenterResult.message const url = uniUpgradeCenterResult.url // 安装包下载地址 - // 此处逻辑仅为示例,可自行编写 - if (code > 0) { - // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回 - const tcbRes = await uniCloud.getTempFileURL({ fileList: [url] }); - if (typeof tcbRes.fileList[0].tempFileURL !== 'undefined') uniUpgradeCenterResult.url = tcbRes.fileList[0].tempFileURL; + // 此处逻辑仅为示例,可自行编写 + if (code > 0) { + // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回 + const tcbRes = await uniCloud.getTempFileURL({ fileList: [url] }); + if (typeof tcbRes.fileList[0].tempFileURL !== 'undefined') uniUpgradeCenterResult.url = tcbRes.fileList[0].tempFileURL; - /** - * 提示升级一 - * 使用 uni.showModal - */ - // return updateUseModal(uniUpgradeCenterResult) + /** + * 提示升级一 + * 使用 uni.showModal + */ + // return updateUseModal(uniUpgradeCenterResult) - // #ifndef UNI-APP-X - // 静默更新,只有wgt有 - if (uniUpgradeCenterResult.is_silently) { - uni.downloadFile({ - url, - success: res => { - if (res.statusCode == 200) { - // 下载好直接安装,下次启动生效 - plus.runtime.install(res.tempFilePath, { - force: false - }); - } - } - }); - return; - } - // #endif + // #ifndef UNI-APP-X + // 静默更新,只有wgt有 + if (uniUpgradeCenterResult.is_silently) { + uni.downloadFile({ + url, + success: res => { + if (res.statusCode == 200) { + // 下载好直接安装,下次启动生效 + plus.runtime.install(res.tempFilePath, { + force: false + }); + } + } + }); + return; + } + // #endif - /** - * 提示升级二 - * 官方适配的升级弹窗,可自行替换资源适配UI风格 - */ - // #ifndef UNI-APP-X - uni.setStorageSync(PACKAGE_INFO_KEY, uniUpgradeCenterResult) - uni.navigateTo({ - url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`, - fail: (err) => { - console.error('更新弹框跳转失败', err) - uni.removeStorageSync(PACKAGE_INFO_KEY) - } + /** + * 提示升级二 + * 官方适配的升级弹窗,可自行替换资源适配UI风格 + */ + uni.setStorageSync(PACKAGE_INFO_KEY, uniUpgradeCenterResult) + // #ifndef UNI-APP-X + uni.navigateTo({ + url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`, + fail: (err) => { + console.error('更新弹框跳转失败', err) + 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 - // #ifdef UNI-APP-X - component?.$callMethod('show', true, uniUpgradeCenterResult) - // #endif + // #endif - return resolve(uniUpgradeCenterResult) - } else if (code < 0) { - console.error(message) - return reject(uniUpgradeCenterResult) - } - return resolve(uniUpgradeCenterResult) - }).catch((err) => { - reject(err) - }) - }); - } + return resolve(uniUpgradeCenterResult) + } else if (code < 0) { + console.error(message) + return reject(uniUpgradeCenterResult) + } + return resolve(uniUpgradeCenterResult) + }).catch((err) => { + reject(err) + }) + }); + } /** * 使用 uni.showModal 升级 @@ -104,13 +105,13 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { let confirmText = '立即下载更新' // #endif - return uni.showModal({ - title, - content: contents, - showCancel: !is_mandatory, - confirmText, - success: res => { - if (res.cancel) return; + return uni.showModal({ + title, + content: contents, + showCancel: !is_mandatory, + confirmText, + success: res => { + if (res.cancel) return; if (isiOS) { // iOS 平台跳转 AppStore @@ -123,10 +124,10 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { return; } - uni.showToast({ - title: '后台下载中……', - duration: 1000 - }); + uni.showToast({ + title: '后台下载中……', + duration: 1000 + }); // wgt 和 安卓下载更新 uni.downloadFile({ @@ -137,7 +138,7 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { return; } // 下载好直接安装,下次启动生效 - // uni-app x 项目没有 plus5+ 故使用条件编译 + // uni-app x 项目没有 plus5+ 故使用条件编译 // #ifndef UNI-APP-X plus.runtime.install(res.tempFilePath, { force: false @@ -166,23 +167,23 @@ function updateUseModal(packageInfo : UniUpgradeCenterResult) : void { }); // #endif - // #ifdef UNI-APP-X - uni.installApk({ - filePath: res.tempFilePath, - success: () => { - uni.showModal({ - title: '安装成功请手动重启' - }); - }, - fail: err => { - uni.showModal({ - title: '更新失败', - content: err.errMsg, - showCancel: false - }); - } - }); - // #endif + // #ifdef UNI-APP-X + uni.installApk({ + filePath: res.tempFilePath, + success: () => { + uni.showModal({ + title: '安装成功请手动重启' + }); + }, + fail: err => { + uni.showModal({ + title: '更新失败', + content: err.errMsg, + showCancel: false + }); + } + }); + // #endif } }); } -- GitLab