wangxy 3 днів тому
батько
коміт
0fb3811634
1 змінених файлів з 137 додано та 0 видалено
  1. 137 0
      utils/versionUpdate.js

+ 137 - 0
utils/versionUpdate.js

@@ -0,0 +1,137 @@
+import {ref} from "vue"
+import cacheManager from "./cacheManager";
+
+export function useVersionUpdate() {
+
+    const progress = ref(0);
+    let downloadTask = null;
+
+    function checkInstallPermission() {
+        // 获取主Activity对象
+        const mainActivity = plus.android.runtimeMainActivity();
+        // 获取PackageManager对象
+        const packageManager = mainActivity.getPackageManager();
+
+        // 正确方式:使用plus.android.invoke调用方法
+        const canRequest = plus.android.invoke(packageManager, "canRequestPackageInstalls");
+
+        if (canRequest) {
+            console.log("应用有安装权限");
+            return true;
+        } else {
+            console.log("应用无安装权限,需要请求");
+            return false;
+        }
+    }
+
+
+    function requestInstallPermission() {
+        return new Promise((resolve) => {
+            // 跳转到允许安装未知来源应用的设置界面
+            const Intent = plus.android.importClass("android.content.Intent");
+            const Settings = plus.android.importClass("android.provider.Settings");
+
+            const mainActivity = plus.android.runtimeMainActivity();
+            const intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
+
+            // 设置应用的包名
+            const uri = plus.android.invoke(
+                plus.android.invoke("android.net.Uri", "parse", "package:" + plus.runtime.appid)
+            );
+            intent.setData(uri);
+
+            // 启动Activity并处理结果
+            mainActivity.startActivityForResult(intent, 1001);
+
+            // 监听Activity结果(需要在App.vue的onActivityResult中全局监听)
+            plus.globalEvent.addEventListener("onActivityResult", (result) => {
+                if (result.requestCode === 1001) {
+                    // 再次检查权限状态
+                    checkInstallPermission().then(hasPermission => {
+                        resolve(hasPermission);
+                    });
+                }
+            });
+        });
+    }
+
+    function downloadAndInstallApk(apkUrl) {
+        return new Promise((resolve, reject) => {
+            uni.showLoading({ title: '下载中...', mask: true });
+
+            uni.downloadFile({
+                url: apkUrl,
+                success: (downloadResult) => {
+                    uni.hideLoading();
+                    // 清理原始缓存 防止新版本缓存 遭遇原始缓存问题
+                    cacheManager.clearAll();
+                    if (downloadResult.statusCode === 200) {
+                        const tempFilePath = downloadResult.tempFilePath;
+
+                        // 安装APK
+                        plus.runtime.install(tempFilePath, { force: true }, () => {
+                            uni.showToast({ title: '安装成功', icon: 'success' });
+                            setTimeout(() => {
+                                plus.runtime.restart(); // 重启应用
+                            }, 1500);
+                            resolve();
+                        }, (err) => {
+                            console.error('安装失败: ', err);
+                            uni.showToast({ title: '安装失败', icon: 'none' });
+                            reject(err);
+                        });
+                    }
+                },
+                fail: (error) => {
+                    uni.hideLoading();
+                    console.error('下载失败: ', error);
+                    uni.showToast({ title: '下载失败', icon: 'none' });
+                    reject(error);
+                }
+            });
+        });
+    }
+
+
+    async function initDownload(url) {
+        console.log('url下载', url)
+        try {
+            // 1. 检查安装权限
+            const hasPermission = await checkInstallPermission();
+
+            console.log('权限', hasPermission)
+
+            if (!hasPermission) {
+                // 2. 如果没有权限,请求权限
+                uni.showModal({
+                    title: '权限申请',
+                    content: '需要您允许应用安装权限,以便完成版本更新。',
+                    confirmText: '去设置',
+                    success: async (res) => {
+                        if (res.confirm) {
+                            const permissionGranted = await requestInstallPermission();
+                            if (permissionGranted) {
+                                // 3. 权限获取成功,开始下载安装
+                                await downloadAndInstallApk(url);
+                            } else {
+                                uni.showToast({ title: '权限获取失败', icon: 'none' });
+                            }
+                        }
+                    }
+                });
+            } else {
+                // 已经有权限,直接下载安装
+                await downloadAndInstallApk(url);
+            }
+        } catch (error) {
+            console.error('更新流程出错: ', error);
+            uni.showToast({ title: '更新失败', icon: 'none' });
+        }
+    }
+
+    return {
+        requestInstallPermission,
+        initDownload,
+        progress
+    }
+}