update.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { Injectable } from '@angular/core';
  2. import { FileOpener } from '@ionic-native/file-opener/ngx';
  3. import { FileTransfer, FileTransferObject } from '@ionic-native/file-transfer/ngx';
  4. import { AppVersion } from '@ionic-native/app-version/ngx';
  5. import { File } from '@ionic-native/file/ngx';
  6. import { AlertController, LoadingController } from '@ionic/angular';
  7. import { HTTP } from '@ionic-native/http/ngx';
  8. @Injectable({
  9. providedIn: 'root'
  10. })
  11. export class Update {
  12. constructor(private file: File,
  13. private transfer: FileTransfer,
  14. private nativeHttp: HTTP,
  15. private appVersion: AppVersion,
  16. private fileOpener: FileOpener,
  17. private loadingCtrl: LoadingController,
  18. public alertController: AlertController) {
  19. }
  20. //设备加载完成再去调用硬件
  21. // ngAfterContentInit(): void {
  22. // //Called after ngOnInit when the component's or directive's content has been initialized.
  23. // //Add 'implements AfterContentInit' to the class.
  24. // this.isUpdate();
  25. // }
  26. async isUpdate() {
  27. // 1、获取当前应用的版本号
  28. // console.log(this.appVersion.getAppName())
  29. let server_version_number = await this.getServerVersionNumber()
  30. let version_number = await this.getVersionNumber()
  31. if (version_number !== server_version_number) {
  32. this.showAlert(server_version_number);
  33. }
  34. }
  35. getVersionNumber() {
  36. return new Promise((resolve, reject) => {
  37. this.appVersion.getVersionNumber().then((value: any) => {
  38. resolve(value)
  39. }).catch(err => {
  40. console.log('getVersionNumber:' + err);
  41. return
  42. });
  43. })
  44. }
  45. getServerVersionNumber() {
  46. return new Promise((resolve, reject) => {
  47. this.nativeHttp.get('http://app.sgsino.cn/version.json', {}, {})
  48. .then(data => {
  49. resolve(JSON.parse(data.data).version)
  50. })
  51. .catch(error => {
  52. console.log(error.status);
  53. console.log(error.error); // error message as string
  54. console.log(error.headers);
  55. });
  56. // from(this.nativeHttp.get(`http://192.168.20.15:803/SoftUpdate/SgApp/version.txt`,
  57. // {},
  58. // {})).pipe(
  59. // finalize(() => { })
  60. // ).subscribe(data => {
  61. // console.log(JSON.parse(data.data).version)
  62. // resolve(JSON.parse(data.data).version)
  63. // }, async err => {
  64. // console.log(err)
  65. // });
  66. // return
  67. })
  68. }
  69. setLoadingText(text: string) {
  70. const elem = document.querySelector(
  71. "div.loading-wrapper div.loading-content");
  72. if (elem) elem.innerHTML = text;
  73. }
  74. async showAlert(version) {
  75. //3.弹窗提示用户是否更新
  76. const alert = await this.alertController.create({
  77. header: '升级!',
  78. message: `发现新版本(${version}),是否立即升级?`,
  79. buttons: [
  80. {
  81. text: '取消',
  82. role: 'cancel',
  83. cssClass: 'secondary',
  84. handler: (blah) => {
  85. }
  86. }, {
  87. text: '确认',
  88. handler: () => {
  89. //4.下载apk
  90. this.downloadApp();
  91. }
  92. }
  93. ]
  94. });
  95. await alert.present();
  96. }
  97. async downloadApp() {
  98. //4.下载apk
  99. const targetUrl = 'http://192.168.20.15:803/SoftUpdate/SgApp/app-debug.apk';
  100. const fileTransfer: FileTransferObject = this.transfer.create();
  101. //获取当前应用的安装(home)目录 1、应用包名称要一致 2、升级的包的版本号要大于当前应用的版本号 3、签名要一致 4、sdk 要安装
  102. fileTransfer.download(targetUrl, this.file.externalDataDirectory + 'app-debug.apk').then((entry) => {
  103. //6、下载完成调用打开应用
  104. this.fileOpener.open(entry.toURL(),
  105. 'application/vnd.android.package-archive')
  106. .then(() => {
  107. console.log('File is opened')
  108. })
  109. .catch(e => {
  110. console.log('Error openening file', e)
  111. });
  112. }, (error) => {
  113. alert(JSON.stringify(error));
  114. });
  115. let loading = await this.loadingCtrl.create({
  116. message: '下载进度:0%'
  117. })
  118. await loading.present()
  119. //5、获取下载进度
  120. fileTransfer.onProgress(async (event) => {
  121. let num = Math.ceil(event.loaded / event.total * 100); //转化成1-100的进度
  122. this.setLoadingText(`下载进度:${num}%`)
  123. if (num === 100) {
  124. loading.dismiss()
  125. }
  126. });
  127. }
  128. }