|
@@ -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
|
|
|
|
+ }
|
|
|
|
+}
|