ionic 热更新

1、下载需要的插件

1.File
2.Transfer
3.File Opener
4.App Version
5.In App Browser
cordova plugin add cordova-plugin-app-version@0.1.9
npm install --save @ionic-native/app-version@4.0.0

cordova plugin add cordova-plugin-file
npm install --save @ionic-native/file@4.1.0

cordova plugin add cordova-plugin-file-opener2@2.2.0
npm install --save @ionic-native/file-opener@4.20.0

cordova plugin add cordova-plugin-file-transfer@1.7.1
npm install --save @ionic-native/transfer@3.14.0

app app.component.ts
import { Platform, ModalController } from ‘ionic-angular’;
platform: Platform,
platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.nativeService.detectionUpgrade()
})

import { Injectable } from '@angular/core';
import { Platform, AlertController, ToastController } from 'ionic-angular';
import { AppVersion } from '@ionic-native/app-version';
import { File } from '@ionic-native/file';
import { FileTransfer, FileTransferObject } from "@ionic-native/file-transfer";
import { FileOpener } from '@ionic-native/file-opener';
import { InAppBrowser } from '@ionic-native/in-app-browser';
import { Observable } from 'rxjs/Rx';
import { HttpSerProvider } from '../app/http-serve';
import { BaseUI } from '../app/baseui';

@Injectable()
export class NativeService extends BaseUI {
  loginMark: string;
  token: string;

  constructor(private platform: Platform,
    private alertCtrl: AlertController,
    private transfer: FileTransfer,
    private appVersion: AppVersion,
    private file: File,
    private fileOpener: FileOpener,
    // private msg : MsgProvider,
    private inAppBrowser: InAppBrowser,
    private httpservice: HttpSerProvider,
    public toastCtrl: ToastController) {
    super();
    this.loginMark = window.localStorage.getItem('loginMark');
    this.token = window.localStorage.getItem('token');
  }


  /**
   * 检查app是否需要升级
   */
  detectionUpgrade() {
  
    //this.appVersion.getVersionNumber()  获取当前apk的版本号类似于1.0.2
    this.appVersion.getVersionNumber().then(res => {
      console.log(res)
      var _that = this;
      var url = "";
      this.httpservice.post(url, JSON.stringify({
        "data": "{'pagination':{rows:50,page: 1,sidx:'F_EditionNumber',sord:'DESC'},'queryJson':\"{'F_EditionType':'1'}\"} "

      })).then(req => {
        try {
          console.log("banben", req)
          var appVersion = req.data.rows[0].F_EditionNumber
          var downLoadUrl = req.data.rows[0].F_DownloadSite
          console.log(appVersion,"传过来的版本号",downLoadUrl,"下载地址")
          window.localStorage.setItem('downLoadUrl', downLoadUrl);
          //当前apk和调用接口的版本号进行对比
          if (appVersion > res) {
            this.alertCtrl.create({
              title: '升级',
              subTitle: '发现新版本,是否立即升级?',
              buttons: [
                {
                  text: '否',
                  role: 'cancel',
                  handler: () => {
                    console.log('不进行更新');
                  }
                },
                {
                  text: '是',
                  handler: () => {
                    this.downloadApp();
                  }
                },
              ]
            }).present();

          }

        } catch (e) {
          const toast = super.showToast(this.toastCtrl, "/Edition/getpagelist接口异常:" + e);

        }

      });

    })

  }

  /**
   * 下载安装app
   */
  downloadApp() {
    
    if (this.isAndroid()) {
      let alert = this.alertCtrl.create({
        title: '下载进度:0%',
        enableBackdropDismiss: false,
        buttons: ['后台下载']
      });
      alert.present();
      let that = this;
      const fileTransfer: FileTransferObject = this.transfer.create();
      const apk = this.file.externalApplicationStorageDirectory + '阀门.apk'; //apk保存在手机里的目录
      const url = localStorage.getItem("downLoadUrl");     //调用接口获取到的下载路径
      fileTransfer.download(url, apk).then((entry) => {
        that.openApk(entry.toURL());
      });

      fileTransfer.onProgress((event: ProgressEvent) => {
        let num = Math.floor(event.loaded / event.total * 100);
        if (num === 100) {
          alert.dismiss();
        } else {
          let title = document.getElementsByClassName('alert-title')[0];
          title && (title.innerHTML = '下载进度:' + num + '%');
        }
      });

    }
    if (this.isIos()) {
      this.openUrlByBrowser(localStorage.getItem("downLoadUrl"));
    }
  }

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

  /**
   * 打开下载的apk
   */
  openApk(url: string) {
    this.fileOpener.open(url, 'application/vnd.android.package-archive').then(res => {
      const toast = super.showToast(this.toastCtrl, "打开apk成功" + res);

    }).catch(err => {
      const toast = super.showToast(this.toastCtrl, "打开apk失败!" + err);

    })
  }
  /**
   * 是否真机环境
   * @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版本号,如0.01
   * @description  对应/config.xml中version的值
   * @returns {Promise<string>}
   */
  getVersionNumber(): Observable<string> {
    return Observable.create(observer => {
      this.appVersion.getVersionNumber().then((value: string) => {
        observer.next(value);
      }).catch(err => {
        observer.error(false);
      });
    });
  }
}

根据cordova官网提示 android 8.0 需要添加配置文件。
Android APK安装限制 打开APK文件进行安装时,以下限制适用:
在Android 8+上,您的应用程序必须具有ACTION_INSTALL_PACKAGE权限。您可以通过将其添加到您的应用程序config.xml文件来添加它:

<platform name="android">
     <config-file parent="/manifest" target="AndroidManifest.xml" xmlns:android="http://schemas.android.com/apk/res/android">
         <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
     </config-file>
</platform>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值