Ionic4.x、Cordova Android 檢測應用版本號、服務器下載文件以及實現App自動升級、安裝

Android App 升級執行流程 css

 

1、獲取本地版本號
2、請求服務器獲取服務器版本號
html

3、本地版本和服務器版本不一致提示升級,彈窗提示用戶是否更新android

4、用戶肯定升級,調用文件傳輸方法下載 apk 文件 服務器

5、監聽下載進度
6、下載完成打開 Apk 進行安裝
app

注意:在 ios 中無法直接下載安裝,若是版本不一致直接跳轉到 Ios 應用對應的應用市場就便可。 async

 


 

自動升級 APP 須要的插件 ionic

 

插件名稱 ide

 

插件地址 this

App Version url

cordova-plugin-app-version

https://ionicframework.com/docs/native/app-version/

File Opener

cordova-plugin-file-opener2

https://ionicframework.com/docs/native/file-opener/

File Transfer

cordova-plugin-file-transfer

https://ionicframework.com/docs/native/file-transfer/

File

cordova-plugin-file

https://ionicframework.com/docs/native/file/

 

app.module.ts 引入注入

 

import { FileOpener } from '@ionic-native/file-opener/ngx';
import { FileTransfer } from '@ionic-native/file-transfer/ngx'; 
import { AppVersion } from '@ionic-native/app-version/ngx'; 
import { File } from '@ionic-native/file/ngx';

 

providers: [
    FileOpener,
    FileTransfer,
    AppVersion,
    File,
    ...
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy } ]

在須要監聽更新下載的頁面引入、注入

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 } from '@ionic/angular';
constructor(private file: File,private transfer:FileTransfer,private appVersion: AppVersion,private fileOpener: FileOpener,public alertController: AlertController) {
}

4、獲取版本號

this.appVersion.getVersionNumber().then((value:any) => { console.log(value)
}).catch(err => { console.log('getVersionNumber:' + err);
});

5、獲取當前的 apk 安裝目錄

 

this.file.dataDirectory

 

const targetUrl = 'http://127.0.0.1:8080/test.apk';
const fileTransfer: FileTransferObject = this.transfer.create(); fileTransfer.download(targetUrl, this.file.dataDirectory + 'test.apk').then((entry) => {
}, (error) => { alert(JSON.stringify(error));
});

6、下載文件,監聽下載進度

onst fileTransfer: FileTransferObject = this.transfer.create();
fileTransfer.download(url, this.file.dataDirectory + test.apk'). then((entry) => {
alert('download complete: ' + entry.toURL()); }, (error) => { 
alert(JSON.stringify(error));});

進度:

var oProgressNum=document.getElementById('num'); fileTransfer.onProgress((event: ProgressEvent) => {
let num =Math.ceil(event.loaded/event.total * 100); if (num === 100) {
oProgressNum.innerHTML='下載完成'; } else {
oProgressNum.innerHTML='下載進度:' + num + '%'; }
});

7、打開安裝文件

 

 this.fileOpener.open(entry.toURL(), 'application/vnd.android.package-archive')
      .then(() => {
console.log('File is opened')
})
.catch(e => {
console.log('Error openening file', e) });

 

demo:

import { Component } 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 } from '@ionic/angular';



@Component({
  selector: 'app-tab1',
  templateUrl: 'tab1.page.html',
  styleUrls: ['tab1.page.scss']
})
export class Tab1Page {


  constructor(private file: File, private transfer: FileTransfer, private appVersion: AppVersion, private fileOpener: FileOpener, 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();
  }

  isUpdate() {
    // 一、獲取當前應用的版本號

    this.appVersion.getVersionNumber().then((value: any) => {
      console.log(value)

      //二、請求服務器接口獲取服務器的版本號

      this.showAlert();

    }).catch(err => {
      console.log('getVersionNumber:' + err);
    });

  }

  async showAlert() {

    //3.彈窗提示用戶是否更新    
    const alert = await this.alertController.create({
      header: '升級!',
      message: '發現新版本,是否當即升級?',
      buttons: [
        {
          text: '取消',
          role: 'cancel',
          cssClass: 'secondary',
          handler: (blah) => {
          }
        }, {
          text: '確認',
          handler: () => {
            //4.下載apk
            this.downloadApp();
          }
        }
      ]
    });
    await alert.present();

  }

  downloadApp() {
    //4.下載apk
    const targetUrl = 'http://127.0.0.1:8080/test.apk';
    const fileTransfer: FileTransferObject = this.transfer.create();

    console.log(this.file.dataDirectory);   //獲取當前應用的安裝(home)目錄     一、應用包名稱要一致   二、升級的包的版本號要大於當前應用的版本號   三、簽名要一致    四、sdk 要安裝

    fileTransfer.download(targetUrl, this.file.dataDirectory + 'aaa.apk').then((entry) => {
      //六、下載完成調用打開應用

       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));
    });


    //五、獲取下載進度    
    var oProgressNum = document.getElementById('progressnum');
    fileTransfer.onProgress((event) => {
      let num = Math.ceil(event.loaded / event.total * 100);  //轉化成1-100的進度
      if (num === 100) {
        oProgressNum.innerHTML = '下載完成';
      } else {
        oProgressNum.innerHTML = '下載進度:' + num + '%';

      }
    });

  }
}

 

效果:

相關文章
相關標籤/搜索