versionUpdate.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import {ref} from "vue"
  2. import cacheManager from "./cacheManager";
  3. export function useVersionUpdate() {
  4. const progress = ref(0);
  5. let downloadTask = null;
  6. function checkInstallPermission() {
  7. // 获取主Activity对象
  8. const mainActivity = plus.android.runtimeMainActivity();
  9. // 获取PackageManager对象
  10. const packageManager = mainActivity.getPackageManager();
  11. // 正确方式:使用plus.android.invoke调用方法
  12. const canRequest = plus.android.invoke(packageManager, "canRequestPackageInstalls");
  13. if (canRequest) {
  14. console.log("应用有安装权限");
  15. return true;
  16. } else {
  17. console.log("应用无安装权限,需要请求");
  18. return false;
  19. }
  20. }
  21. function requestInstallPermission() {
  22. return new Promise((resolve) => {
  23. // 跳转到允许安装未知来源应用的设置界面
  24. const Intent = plus.android.importClass("android.content.Intent");
  25. const Settings = plus.android.importClass("android.provider.Settings");
  26. const mainActivity = plus.android.runtimeMainActivity();
  27. const intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
  28. // 设置应用的包名
  29. const uri = plus.android.invoke(
  30. plus.android.invoke("android.net.Uri", "parse", "package:" + plus.runtime.appid)
  31. );
  32. intent.setData(uri);
  33. // 启动Activity并处理结果
  34. mainActivity.startActivityForResult(intent, 1001);
  35. // 监听Activity结果(需要在App.vue的onActivityResult中全局监听)
  36. plus.globalEvent.addEventListener("onActivityResult", (result) => {
  37. if (result.requestCode === 1001) {
  38. // 再次检查权限状态
  39. checkInstallPermission().then(hasPermission => {
  40. resolve(hasPermission);
  41. });
  42. }
  43. });
  44. });
  45. }
  46. function downloadAndInstallApk(apkUrl) {
  47. return new Promise((resolve, reject) => {
  48. uni.showLoading({ title: '下载中...', mask: true });
  49. uni.downloadFile({
  50. url: apkUrl,
  51. success: (downloadResult) => {
  52. uni.hideLoading();
  53. // 清理原始缓存 防止新版本缓存 遭遇原始缓存问题
  54. cacheManager.clearAll();
  55. if (downloadResult.statusCode === 200) {
  56. const tempFilePath = downloadResult.tempFilePath;
  57. // 安装APK
  58. plus.runtime.install(tempFilePath, { force: true }, () => {
  59. uni.showToast({ title: '安装成功', icon: 'success' });
  60. setTimeout(() => {
  61. plus.runtime.restart(); // 重启应用
  62. }, 1500);
  63. resolve();
  64. }, (err) => {
  65. console.error('安装失败: ', err);
  66. uni.showToast({ title: '安装失败', icon: 'none' });
  67. reject(err);
  68. });
  69. }
  70. },
  71. fail: (error) => {
  72. uni.hideLoading();
  73. console.error('下载失败: ', error);
  74. uni.showToast({ title: '下载失败', icon: 'none' });
  75. reject(error);
  76. }
  77. });
  78. });
  79. }
  80. async function initDownload(url) {
  81. console.log('url下载', url)
  82. try {
  83. // 1. 检查安装权限
  84. const hasPermission = await checkInstallPermission();
  85. console.log('权限', hasPermission)
  86. if (!hasPermission) {
  87. // 2. 如果没有权限,请求权限
  88. uni.showModal({
  89. title: '权限申请',
  90. content: '需要您允许应用安装权限,以便完成版本更新。',
  91. confirmText: '去设置',
  92. success: async (res) => {
  93. if (res.confirm) {
  94. const permissionGranted = await requestInstallPermission();
  95. if (permissionGranted) {
  96. // 3. 权限获取成功,开始下载安装
  97. await downloadAndInstallApk(url);
  98. } else {
  99. uni.showToast({ title: '权限获取失败', icon: 'none' });
  100. }
  101. }
  102. }
  103. });
  104. } else {
  105. // 已经有权限,直接下载安装
  106. await downloadAndInstallApk(url);
  107. }
  108. } catch (error) {
  109. console.error('更新流程出错: ', error);
  110. uni.showToast({ title: '更新失败', icon: 'none' });
  111. }
  112. }
  113. return {
  114. requestInstallPermission,
  115. initDownload,
  116. progress
  117. }
  118. }