diff --git a/pages.json b/pages.json index 75a12f70639aaafb5127a79cbfe5a5074f37c5f1..798f570bd9147cae6e0d13ae0e62908f06b44632 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 c9fb59063c9af4392b02362946a28fe8c176e20f..c694b947d24d26170c232e4a3d22f7c50d6b4a4d 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 01dd25b917d4979416c90b4dda7a73c068e554bb..2e87e6754f19b07a755584f610b962ee84a4575c 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 7654638001349355afdfb4d410395ca0f5887c28..65dabb1eeab1fe60b3941da3ae3928d791dcd1ef 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 76b1ffe5376603d86e7ac295e4d52e5d4ddf0284..319362facedd8ea2bd09357254ca328073723f87 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 4a0af00f4aa79b0eca2d69762fb8cac257b0c1e8..877d62a97f36edfccb809950f435a0a744dd4e0f 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 d8ecf2d2c89660640c89c50c335da213bd6bd708..81757dbabbb80ff36953810c33ac022bf94227e2 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 } }); }