Ionic4.x、Cordova Android 检测应用版本号、服务器下载文件以及实现App自动升级、安装
Android App 升级执行流程
1、获取本地版本号
2、请求服务器获取服务器版本号
3、本地版本和服务器版本不一致提示升级,弹窗提示用户是否更新
4、用户确定升级,调用文件传输方法下载 apk 文件
5、监听下载进度
6、下载完成打开 Apk 进行安装
注意:在 ios 中没法直接下载安装,如果版本不一致直接跳转到 Ios 应用对应的应用市场就即可。
自动升级 APP 需要的插件
| 
 插件名称  | 
 插件地址  | 
|
| 
 App Version  | 
 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() {
    // 1、获取当前应用的版本号
    this.appVersion.getVersionNumber().then((value: any) => {
      console.log(value)
      //2、请求服务器接口获取服务器的版本号
      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)目录     1、应用包名称要一致   2、升级的包的版本号要大于当前应用的版本号   3、签名要一致    4、sdk 要安装
    fileTransfer.download(targetUrl, this.file.dataDirectory + 'aaa.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));
    });
    //5、获取下载进度
    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 + '%';
      }
    });
  }
}
效果:

出现失败问题可能如下:
1.无法获取下载请求
1)先检查验证url是否正确
2).Android9.0以上改为https,使用域名下载
2.更换下载插件,使用downloader
ionic cordova plugin add integrator-cordova-plugin-downloader
npm install @ionic-native/downloader
3.无法打开跳转安装,请先检查权限问题:
在platforms\android\app\src\main中的AndroidManifest.xml添加
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
4.其他情况原因导致的,可能是手机版本或sdk环境,或插件版本或ionic版本和插件兼容性等等问题
Ionic4.x、Cordova Android 检测应用版本号、服务器下载文件以及实现App自动升级、安装的更多相关文章
- Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转
		
Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...
 - android开发步步为营之67:使用android开源项目android-async-http异步下载文件
		
android-async-http项目地址 https://github.com/loopj/android-async-http.android-async-http顾名思义是异步的http请求, ...
 - 【FTP】C# System.Net.FtpClient库连接ftp服务器(下载文件)
		
如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...
 - (4)FTP服务器下载文件
		
上一篇中,我们提到了怎么从FTP服务器下载文件.现在来具体讲述一下. 首先是路径配置.. 所以此处我们需要一个app.config来设置路径. <?xml version="1.0&q ...
 - Python 实现批量从不同的Linux服务器下载文件
		
基于Python实现批量从不同的Linux服务器下载文件 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/file_for_downl ...
 - 从Linux服务器下载文件到本地命令
		
从Linux服务器下载文件夹到本地1.使用scp命令 scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文件 ...
 - 从Linux服务器下载文件夹到本地
		
从Linux服务器下载文件夹到本地 1.使用scp命令 scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文 ...
 - Java Web实现使用浏览器从服务器下载文件(后台)
		
Java Web实现 使用浏览器从服务器下载文件. 下面实现两种情况的下载,需求如下: 需求(一):1.用户在页面填写表单. 2.填写完成后,选择下载,将表单内容发往后台. 3.后台根据内容生产一个文 ...
 - js从服务器下载文件
		
通常,将文件绝对路径url作为超链接<a>的链接地址href的值,点击<a>后,浏览器将会尝试请求文件资源,如果浏览器能够辨认文件类型,则将会以预设的打开方式直接打开下载的文件 ...
 
随机推荐
- SecurityProtocolType 枚举
			
地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.net.securityprotocoltype?redirectedfrom=MSDN&a ...
 - python3 tkinter模块
			
一.tkinter 1.tkinter--tool kit interface工具包接口,用于GUI(Graphical User Interface)用户图形界面, 2.python3.x把Tkin ...
 - 神经网络(4)---神经网络是如何帮助我们学习复杂的nonlinear hypotheses
			
神经网络是如何一步步进行计算的,以及对计算过程的向量化 Z1(2),Z2(2),Z3(2) are just weighted linear combination of input value x1 ...
 - 关于 or 判断都是Ture的问题
			
问题: 1. ret1 = [1, 2, 3, 4] if 11 or 33 in ret1: print("ok") else: print("no") 2. ...
 - 012——matlab判断变量是否存在
			
(一)参考文献:https://www.ilovematlab.cn/thread-48319-1-1.html (二) clc clear a = exist('a') ans =1 clc cle ...
 - 解决VS2010自带的C/C++编译器CL找不到mspdb100.dll的问题
			
https://www.cnblogs.com/dudu/archive/2011/05/21/2053104.html 更好解决方法是在命令行中运行vsvars32.bat: "C:\Pr ...
 - learning java java.time相关类
			
var clock = Clock.systemUTC(); System.out.println(clock.instant()); System.out.println(clock.millis( ...
 - ElasticSearch使用C#操作文档
			
一.ElasticSearch的.net客户端驱动程序 ElasticSearch官方网站提供了两个.net客户端驱动程序,其中Elasticsearch.Net是一个非常底层且灵活的客户端驱动程序, ...
 - cube.js 学习(三)cube.js data schema
			
cube.js的 data schema 类似graphql 的type 定义,但是cube.js 的data schema 更偏向于dsl, 其中抽象了进行数据分析应用开发中的东西,自己提炼了mea ...
 - codevs 1792 分解质因数
			
1792 分解质因数 题目描述 Description 编写一个把整数N分解为质因数乘积的程序. 输入描述 Input Description 输入一个整数 N 输出描述 Output Descr ...