versionUpdate.js 3.7 KB

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