ionic3 APP版本更新

Ionic 等版本信息

注意:安装平台android 6.3.0的小伙伴,安装插件时,一定要选择下面的版本安装,否则出错。
platforms\android\AndroidManifest.xml
android:targetSdkVersion版本
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26" />

// 1 安装插件
 // 权限 
$ ionic cordova plugin add cordova-plugin-android-permissions@1.0.0
$ npm install --save @ionic-native/android-permissions@4.5.0
// 文件管理 
$ ionic cordova plugin add cordova-plugin-file@6.0.1
$ npm install --save @ionic-native/file@4.18.0
// 文件上传 
$ ionic cordova plugin add cordova-plugin-file-opener2@2.0.19
$ npm install --save @ionic-native/file-opener@4.7.0

$ ionic cordova plugin add cordova-plugin-file-transfer@1.7.1
$ npm install --save @ionic-native/file-transfer@4.7.0
// 版本检测 
$ ionic cordova plugin add cordova-plugin-app-version@0.1.9 
$ npm install --save @ionic-native/app-version@4.7.0 
// 浏览器 
$ ionic cordova plugin add cordova-plugin-inappbrowser 
$ npm install --save @ionic-native/in-app-browser 



//添加插件 
//app.module.ts 
import { AndroidPermissions } from '@ionic-native/android-permissions'; 
import { File } from "@ionic-native/file"; 
import { FileOpener } from "@ionic-native/file-opener"; 
import { FileTransfer,FileTransferObject } from "@ionic-native/file-transfer"; 
import { AppVersion } from "@ionic-native/app-version"; 
import { InAppBrowser} from "@ionic-native/in-app-browser"; 
 ... 
providers: 
[ StatusBar, SplashScreen, 
{provide: ErrorHandler, useClass: IonicErrorHandler}, 
AndroidPermissions, File, AppVersion, FileOpener, FileTransfer, FileTransferObject, NativeService, InAppBrowser
 ] 

// 2 应用
// 新建  src\providers\public\public.ts
import { HttpClient,HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';

import { ConfigProvider } from '../config/config';
import { AlertController } from 'ionic-angular/components/alert/alert-controller';
import { LoadingController } from 'ionic-angular/components/loading/loading-controller';
import { File } from '@ionic-native/file';
import { FileTransfer, FileTransferObject } from '@ionic-native/file-transfer';
import { AppVersion } from '@ionic-native/app-version';
import { FileOpener } from '@ionic-native/file-opener';
import { AndroidPermissions } from '@ionic-native/android-permissions';
import { ToastController } from 'ionic-angular/components/toast/toast-controller';
import { Platform } from 'ionic-angular/platform/platform';

/*
  Generated class for the PublicProvider provider.

  See https://angular.io/guide/dependency-injection for more info on providers
  and Angular DI.
*/
@Injectable()
export class PublicProvider {
  /*公共post提交頭*/
  public httpOptions = {
    headers: new HttpHeaders({ 
      "Accept": "application/json",
      "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
      "Authorization":  '' ,
    })
  };

  constructor(public http: HttpClient, public config: ConfigProvider
    ,public alertCtrl:AlertController,public loadingCtrl:LoadingController
    ,private transfer: FileTransfer,
    private file: File,private appVersion: AppVersion,private fileOpener:FileOpener
    ,private androidPermissions: AndroidPermissions,public toastCtrl: ToastController,public platform: Platform
  ) {
    // console.log('Hello PublicProvider Provider');
  }
    
  //检查版本更新
  new_version(callback){
    var url = ‘http://www.test.com/test’;
    return this.http.get(url,this.httpOptions).subscribe(function(data){
      callback(data);
    });
  }



  /***** 自动更新APP版本  开始 ******************************/  
  public now_version = '';//当前版本
  public new_app = {//最新版本
    new_version: '',//版本号
    text : '',//更新简介
    url : '',//下载地址
  };

  public has_new : boolean = false;
  get_now_version(){
    var _that = this;
    this.appVersion.getVersionNumber().then(data=>{
      _that.now_version = data;
    });
    return _that.now_version
  }
  check_version(){
    var _that = this;

    //服务器端获取最新版
    this.new_version(data=>{
      _that.new_app.new_version = data.data.version;
      _that.new_app.text = data.data.text;
      _that.new_app.url =  data.data.file_url;
    });

    console.log('_that.new_app');
    console.log(_that.new_app);

    this.appVersion.getVersionNumber().then(data=>{
      _that.now_version = data;
    });

    console.log('_that.now_version = ' + _that.now_version);
  
    //当前版本
    let nowVersionNum = parseInt(this.now_version.toString().replace(new RegExp(/(\.)/g), '0')); 
    // alert('当前版本:'+nowVersionNum);
    let newVersionNum = parseInt(this.new_app.new_version.toString().replace(new RegExp(/(\.)/g), '0'));
    if(nowVersionNum < newVersionNum){
      this.has_new = true;
    }

    console.log('nowVersionNum = ' + nowVersionNum);
    console.log('newVersionNum = ' + newVersionNum);
  }

  presentToast(message: string) {
    let toast = this.toastCtrl.create({message: message, duration: 2000});
    toast.present().then(value => {
      return value;
    });
  }

  autoUpdateApp(){
    setTimeout(() => {

      this.appVersion.getVersionNumber().then(data=>{
        this.now_version = data;
      });
      //服务器端获取最新版
      this.new_version(data=>{
        this.new_app.new_version = data.data.version;
        this.new_app.text = data.data.text;
        this.new_app.url =  data.data.file_url;
        this.updateAPP()
      });

    }, 3000);
  }

  updateAPP(){
    this.check_version()
    //当前版本
    let nowVersionNum = parseInt(this.now_version.toString().replace(new RegExp(/(\.)/g), '0')); 
    // alert('当前版本:'+nowVersionNum);
    let newVersionNum = parseInt(this.new_app.new_version.toString().replace(new RegExp(/(\.)/g), '0')); 
    // alert('最新版本:'+newVersionNum);
    if(nowVersionNum < newVersionNum){
          
      let confirm = this.alertCtrl.create({
        title: '有新版本发布,是否下载更新?',
        message: this.new_app.text,
        buttons: [
          {
            text: '取消',
            handler: () => {
              console.log('Disagree clicked');
              // return false;
              this.check_version()
            }
          },
          {
            text: '确认',
            handler: () => {
              this.permissionsFun()
              //this.download();
            }
          }
        ]
      });
      confirm.present();
    }else{
      this.presentToast('当前已是最新版本');
    }
    
  }

  download(){
    if (this.isAndroid()) {
      var _that = this;
      const fileTransfer: FileTransferObject = this.transfer.create();
      
      //目录创建文件夹 new Date().getTime()
      this.file.createDir(this.file.externalRootDirectory, "martiantoken", false)
      let externalRootDirectory = this.file.externalRootDirectory + 'martiantoken/martiantoken.apk';
      console.log('this.new_app.url')
      console.log(this.new_app.url)

      console.log('externalRootDirectory')
      console.log(externalRootDirectory)


      let num :number = 1;
      fileTransfer.onProgress((event: ProgressEvent) => {
        num =Math.floor(event.loaded/event.total * 100);
      });
      
      let loading = _that.loadingCtrl.create({
        content: '下载进度:'+ num + '%'
      });
      loading.present(); 

      fileTransfer.download(this.new_app.url, externalRootDirectory).then((entry) => {
          // alert('下载成功: ' + entry.toURL());
          _that.fileOpener.open(entry.toURL(),'application/vnd.android.package-archive');
        }, (error) => { 
          
          let confirm = this.alertCtrl.create({
            title: '请开启存储权限',
            message: '权限被拒绝,请在手机设置里手动开启存储权限',
            buttons: [
              {
                text: '取消',
                handler: () => {
                  console.log('Disagree clicked');
                  // return false;
                  //this.check_version()
                  loading.dismiss();
                }
              },
              {
                text: '确认',
                handler: () => {
                  loading.dismiss();
                  this.download();
                }
              }
            ]
          });
          confirm.present();
          
          return false;
        }
      );
    

      

      let timer = setInterval(() => {
          loading.setContent("下载进度:" + num + "%");
          if (num >= 99) {
              clearInterval(timer);
              loading.dismiss();
          }
      }, 300);

    }


    // if (this.isIos()) {
    //   this.openUrlByBrowser("这里边填写下载iOS地址");
    // }


  }


   //检查权限
   permissionsFun(){
    this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.READ_EXTERNAL_STORAGE).then(
      result => {
        if (!result.hasPermission){
          this.androidPermissions.requestPermissions([this.androidPermissions.PERMISSION.READ_EXTERNAL_STORAGE])
            .then(result => {//弹出弹框是否允许
              if(result.hasPermission){//点击允许
                this.download();
                // alert("允许使用LOCATION权限");
              }else{//点击拒绝
                // alert("拒绝使用LOCATION权限");
                //this.platform.exitApp();//退出APP
              }
          });
        }else{
          this.download();
          // alert("已允许位置权限" + result.hasPermission);
        }
  
      },
      err => {
        this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION)
      }
  
    );
  }


  /**
   * 通过浏览器打开url
   */
  openUrlByBrowser(url: string): void {
    //this.inAppBrowser.create(url, '_system');
  }

  /**
   * 是否真机环境
   * @return {boolean}
   */
  isMobile(): boolean {
    return this.platform.is('mobile') && !this.platform.is('mobileweb');
  }

  /**
   * 是否android真机环境
   * @return {boolean}
   */
  isAndroid(): boolean {
    return this.isMobile() && this.platform.is('android');
  }

  /**
   * 是否ios真机环境
   * @return {boolean}
   */
  isIos(): boolean {
    return this.isMobile() && (this.platform.is('ios') || this.platform.is('ipad') || this.platform.is('iphone'));
  }

  /***** 自动更新APP版本  结束 ******************************/  
  

}


// app.component.ts

import { Component } from '@angular/core';
import { Platform, AlertController } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { PublicProvider } from '../providers/public/public';


@Component({
  templateUrl: 'app.html'
})
export class MyApp {
  rootPage:any;

  constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen,public publicPro: PublicProvider
    
    ) {
    console.log('MyApp-----');
    this.platformReady()
    this.publicPro.autoUpdateApp();
  }

  platformReady() {
    // Call any initial plugins when ready
    this.platform.ready().then(() => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();
      this.statusBar.overlaysWebView(false);
      this.statusBar.backgroundColorByHexString('#333333');
    });
  }

}



参考网址:https://www.jianshu.com/p/6f88d9c95919

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容