import { Injectable } from '@angular/core'; import { FileOpener } from '@ionic-native/file-opener/ngx'; import { FileTransfer, FileTransferObject } from '@ionic-native/file-transfer/ngx'; import { AppVersion } from '@ionic-native/app-version/ngx'; import { File } from '@ionic-native/file/ngx'; import { AlertController, LoadingController } from '@ionic/angular'; import { HTTP } from '@ionic-native/http/ngx'; @Injectable({ providedIn: 'root' }) export class Update { constructor(private file: File, private transfer: FileTransfer, private nativeHttp: HTTP, private appVersion: AppVersion, private fileOpener: FileOpener, private loadingCtrl: LoadingController, public alertController: AlertController) { } //设备加载完成再去调用硬件 // ngAfterContentInit(): void { // //Called after ngOnInit when the component's or directive's content has been initialized. // //Add 'implements AfterContentInit' to the class. // this.isUpdate(); // } async isUpdate() { // 1、获取当前应用的版本号 // console.log(this.appVersion.getAppName()) let server_version_number = await this.getServerVersionNumber() let version_number = await this.getVersionNumber() if (version_number !== server_version_number) { this.showAlert(server_version_number); } } getVersionNumber() { return new Promise((resolve, reject) => { this.appVersion.getVersionNumber().then((value: any) => { resolve(value) }).catch(err => { console.log('getVersionNumber:' + err); return }); }) } getServerVersionNumber() { return new Promise((resolve, reject) => { this.nativeHttp.get('http://app.sgsino.cn/version.json', {}, {}) .then(data => { resolve(JSON.parse(data.data).version) }) .catch(error => { console.log(error.status); console.log(error.error); // error message as string console.log(error.headers); }); // from(this.nativeHttp.get(`http://192.168.20.15:803/SoftUpdate/SgApp/version.txt`, // {}, // {})).pipe( // finalize(() => { }) // ).subscribe(data => { // console.log(JSON.parse(data.data).version) // resolve(JSON.parse(data.data).version) // }, async err => { // console.log(err) // }); // return }) } setLoadingText(text: string) { const elem = document.querySelector( "div.loading-wrapper div.loading-content"); if (elem) elem.innerHTML = text; } async showAlert(version) { //3.弹窗提示用户是否更新 const alert = await this.alertController.create({ header: '升级!', message: `发现新版本(${version}),是否立即升级?`, buttons: [ { text: '取消', role: 'cancel', cssClass: 'secondary', handler: (blah) => { } }, { text: '确认', handler: () => { //4.下载apk this.downloadApp(); } } ] }); await alert.present(); } async downloadApp() { //4.下载apk const targetUrl = 'http://192.168.20.15:803/SoftUpdate/SgApp/app-debug.apk'; const fileTransfer: FileTransferObject = this.transfer.create(); //获取当前应用的安装(home)目录 1、应用包名称要一致 2、升级的包的版本号要大于当前应用的版本号 3、签名要一致 4、sdk 要安装 fileTransfer.download(targetUrl, this.file.externalDataDirectory + 'app-debug.apk').then((entry) => { //6、下载完成调用打开应用 this.fileOpener.open(entry.toURL(), 'application/vnd.android.package-archive') .then(() => { console.log('File is opened') }) .catch(e => { console.log('Error openening file', e) }); }, (error) => { alert(JSON.stringify(error)); }); let loading = await this.loadingCtrl.create({ message: '下载进度:0%' }) await loading.present() //5、获取下载进度 fileTransfer.onProgress(async (event) => { let num = Math.ceil(event.loaded / event.total * 100); //转化成1-100的进度 this.setLoadingText(`下载进度:${num}%`) if (num === 100) { loading.dismiss() } }); } }