import {Inject, Injectable} from '@angular/core'; import {FileOpener} from '@ionic-native/file-opener/ngx'; import {FileTransfer, FileTransferObject} from '@ionic-native/file-transfer/ngx'; import {File} from '@ionic-native/file/ngx'; import {InAppBrowser} from '@ionic-native/in-app-browser/ngx'; import {Storage} from '@ionic/storage'; import {NativeService} from './native-service'; import {AlertController, LoadingController, ModalController, Platform, ToastController} from '@ionic/angular'; import {M2_DEVICE_INFO_PROVIDER} from '../../core/tokens/m2.tokens'; import {DeviceInfoInterface} from '../../core/interfaces/device-info.interface'; import {PLATFORM} from '../../core/enum/platform'; import {M2Toast} from '../../layout/setting/m2.toast'; import {ModalUpdatePage} from './modal-update/modal-update.page'; import {AppData} from '../../../df-ext/app-data'; @Injectable({ providedIn: 'root' }) export class UpgradeService { constructor(private alertCtrl: AlertController, private fileOpener: FileOpener, private transfer: FileTransfer, @Inject(M2_DEVICE_INFO_PROVIDER) private deviceInfoInterface: DeviceInfoInterface, private file: File, private iab: InAppBrowser, private loadingCtrl: LoadingController, private platform: Platform, private modalController: ModalController, private storage: Storage, private m2Toast: M2Toast) { } checkAndUpgrade() { this.deviceInfoInterface.ready().then(item => { if (item.appVersion !== item.remoteVersion) { if (item.platform === PLATFORM.Android) { this.detectionUpgradeAndroid(AppData.config.APK_DOWNLOAD, item.forceUpgrade, item.upgradeContent, item.remoteVersion); } else if (item.platform === PLATFORM.IOS) { this.detectionUpgradeIOS(item.forceUpgrade, item.upgradeContent); } else { this.m2Toast.presentInfoToast('运行环境是:' + item.platform + ', 不应该有更新!请检查配置!'); } } }); } checkVersionSelf(appVersion: string, pltVersion: number) { this.deviceInfoInterface.ready().then(async item => { if (item.appVersion !== item.remoteVersion) { if (item.platform === PLATFORM.Android) { this.detectionUpgradeAndroid(AppData.config.APK_DOWNLOAD, item.forceUpgrade, item.upgradeContent, item.remoteVersion); } else if (item.platform === PLATFORM.IOS) { this.detectionUpgradeIOS(item.forceUpgrade, item.upgradeContent); } } else { this.m2Toast.presentInfoToast('当前已是最新版本!'); } }); } private async detectionUpgradeAndroid(apkUrl, ifForce, upgradeContent: string, remoteVersion: string) { // if (ifForce) { // const alert = await this.alertCtrl.create({ // subHeader: '发现新版本,需要立即升级', // message: upgradeContent, // backdropDismiss: false, // buttons: [{ // text: '取消', // handler: () => { // navigator['app'].exitApp(); // work in ionic 4 // } // }, { // text: '确定', // handler: () => { // this.downloadApp(apkUrl); // } // }] // }); // await alert.present(); // } else { // const alert = await this.alertCtrl.create({ // subHeader: '发现新版本,是否立即升级?', // message: upgradeContent, // backdropDismiss: false, // buttons: [{ // text: '取消' // }, { // text: '确定', // handler: () => { // this.downloadApp(apkUrl); // } // }] // }); // await alert.present(); // } const modal = await this.modalController.create({ component: ModalUpdatePage, componentProps: { title: '发现新版本,需要立即升级', remoteVersion, upgradeContent, ifForce }, backdropDismiss: false }); await modal.present(); return; } private async detectionUpgradeIOS(ifForce: boolean, upgradeContent: string) { if (ifForce) { const alert = await this.alertCtrl.create({ header: '发现新版本,需要立即升级', subHeader: upgradeContent, backdropDismiss: false, buttons: [{ text: '确定', handler: () => { this.openBrowser(); return false; } }] }); await alert.present(); } else { const alert = await this.alertCtrl.create({ header: '发现新版本,是否立即升级?', subHeader: upgradeContent, backdropDismiss: false, buttons: [{ text: '取消' }, { text: '确定', handler: () => { this.openBrowser(); } }] }); await alert.present(); } } private async downloadApp(apkUrl) { const loading = await this.loadingCtrl.create({ message: '下载进度:0%', backdropDismiss: false }); loading.present(); const fileTransfer: FileTransferObject = this.transfer.create(); const apk = this.file.externalDataDirectory + 'm2app.apk'; // apk保存的目录 fileTransfer.download(apkUrl, apk).then(() => { this.fileOpener.open(apk, 'application/vnd.android.package-archive').then(() => { console.log('File is opened'); }).catch(async e => { console.log('Error openening file', e); const alert1 = await this.alertCtrl.create({ header: '自动升级失败,将转入下载页面!', backdropDismiss: false, buttons: [{ text: '确定', handler: () => { this.openBrowser(); (navigator as any).app.exitApp(); // work in ionic 4 } }] }); await alert1.present(); }); }); let num = 0; fileTransfer.onProgress((event: ProgressEvent) => { num = Math.floor(event.loaded / event.total * 100); }); setInterval(async () => { if (num === 100) { await loading.dismiss(); } else { // loading('下载进度:' + num + '%'); } }, 300); } private openBrowser() { this.iab.create(AppData.config.APP_DOWNLOAD, '_system'); } }