美文网首页ionic3项目收集ionic2实战
ionic2实战-添加app升级功能

ionic2实战-添加app升级功能

作者: 昵称已被使用_ | 来源:发表于2017-04-24 23:06 被阅读7836次

效果演示

插件准备

1.File
2.Transfer
3.File Opener
4.App Version
5.In App Browser

上代码

  • app.component.ts调用检查是否升级方法


  • NativeService.ts下载安装app方法


  /**
 * Created by yanxiaojun617@163.com on 12-27.
 */
import {Injectable} from '@angular/core';
import {Platform, AlertController} from 'ionic-angular';
import {AppVersion} from '@ionic-native/app-version';
import {File} from '@ionic-native/file';
import {Transfer, TransferObject} from '@ionic-native/transfer';
import {FileOpener} from '@ionic-native/file-opener';
import {InAppBrowser} from '@ionic-native/in-app-browser';
import {APP_DOWNLOAD, APK_DOWNLOAD} from "./Constants";

@Injectable()
export class NativeService {

  constructor(private platform: Platform,
              private alertCtrl: AlertController,
              private transfer: Transfer,
              private appVersion: AppVersion,
              private file: File,
              private fileOpener: FileOpener,
              private inAppBrowser: InAppBrowser) {
  }


  /**
   * 检查app是否需要升级
   */
  detectionUpgrade() {
    //这里连接后台获取app最新版本号,然后与当前app版本号(this.getVersionNumber())对比
    //版本号不一样就需要申请,不需要升级就return
    this.alertCtrl.create({
      title: '升级',
      subTitle: '发现新版本,是否立即升级?',
      buttons: [{text: '取消'},
        {
          text: '确定',
          handler: () => {
            this.downloadApp();
          }
        }
      ]
    }).present();
  }

  /**
   * 下载安装app
   */
  downloadApp() {
    if (this.isAndroid()) {
      let alert = this.alertCtrl.create({
        title: '下载进度:0%',
        enableBackdropDismiss: false,
        buttons: ['后台下载']
      });
      alert.present();

      const fileTransfer: TransferObject = this.transfer.create();
      const apk = this.file.externalRootDirectory + 'android.apk'; //apk保存的目录

      fileTransfer.download(APK_DOWNLOAD, apk).then(() => {
       this.fileOpener.open(apk,'application/vnd.android.package-archive');
      });

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

  /**
   * 通过浏览器打开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版本号,如0.01
   * @description  对应/config.xml中version的值
   * @returns {Promise<string>}
   */
  getVersionNumber(): Promise<string> {
    return new Promise((resolve) => {
      this.appVersion.getVersionNumber().then((value: string) => {
        resolve(value);
      }).catch(err => {
        console.log('getVersionNumber:' + err);
      });
    });
  }
}

  • Constants.ts你可以先访问这两个url看是什么鬼
export const APP_DOWNLOAD = 'http://omzo595hi.bkt.clouddn.com/download.html';//app下载地址
export const APK_DOWNLOAD = 'http://omzo595hi.bkt.clouddn.com/ionic2_tabs.apk';//apk下载完整地址

最后

  • 后来把app升级逻辑放到单独的service中了.源码VersionService.ts

  • ios下载.ipa文件是不能直接打开安装的,一般的ios app升级都是跳到App Store中

  • 我们的企业用app,一般不上应用商店,所以要制作单独的下载页面,像这个页面,app需要升级的时候跳到这个下载页面,用户手动下载安装

  • 下载页面制作教程看这里

  • app下载完成不能安装?检查手机是否安装了同id的app,卸载即可

app升级版本号只能升不能降
release版本和debug版本不能同时安装,如果已经安装了release版本,再安装debug版会安装失败

相关文章

网友评论

  • 6ed7cdfa16f0:请教大神,在iphone上获取版本号,真机运行时提示cordova_not_avaliable。请问需要配置什么权限么?
    platform.ready().then(() => {

    if(platform.is('cordova')){
    storageService.write('platform', device.platform);

    //获取版本号和设备
    appVersion.getVersionNumber().then(res=>{
    storageService.write('versionNumber', res);
    alert(res);
    },error=>{
    alert(error)
    });
    }

    });
    昵称已被使用_:@C_ceab 这个提示说你不是真机
  • BlueBlue5:学习了,目前遇到的问题是在三星手机上下载完成后打不开下载文件,没有弹出安装包页面,不知道什么问题,在小米和华为手机上正常覆盖安装
    有梦想的风筝:@BlueBlue5 请问8.0下载之后打不开下载文件的问题是如何解决的
    BlueBlue5:解决了:joy:
    BlueBlue5:安装失败的三星手机内核为8.0 ,其他是7.0,有什么好的解决方案吗
  • 78f7a3f5b564:请问下要在android.json里面配置权限吗? 为什么有些手机能直接下载 有些不能 一直是0%
    78f7a3f5b564:@小军617 感谢 已经解决了 部分android8.0的手机需要手动打开权限才行
    昵称已被使用_:@大声点 用到android.permission.WRITE_EXTERNAL_STORAGE权限,Transfer插进已经配置了。如果下载不了,调试看是不是this.file.externalRootDirectory获取的保存目录有问题,可以尝试换一个
  • 转身丶黄昏灬:大神你好,我最近在研究ionic,参考你的方法,使用fileOpener.open(),打开安装包跳转到软件包安装程序界面,点击安装后,读完进度条就显示"应用未安装",这个是什么问题?
    转身丶黄昏灬:@小军617 嗯,是的,那天后来我换了一台设备发现了,提示"已安装相同签名的应用",当时安装的是debug版本,然后打包之后的是release版本,所以导致失败了,还有版本号也是个问题,一样的版本号并不会覆盖安装
    昵称已被使用_:@转身丶黄昏灬 > app升级版本号只能升不能降
    > release版本和debug版本不能同时安装,如果已经安装了release版本,再安装debug版会安装失败
    昵称已被使用_:@转身丶黄昏灬 你手机是不是已经安装同id的app
  • 不在三重门:externalStoragePermissionsAuthorization()
    这个请求权限的方法会报错.
    所以我换了一种方式
    import { AndroidPermissions } from '@ionic-native/android-permissions';
    constructor(
    private androidPermissions: AndroidPermissions)
    platform.ready().then(() => {
    androidPermissions.requestPermissions(
    [
    androidPermissions.PERMISSION.READ_EXTERNAL_STORAGE,
    androidPermissions.PERMISSION.WRITE_EXTERNAL_STORAGE
    ]
    );
    })
    }

    判断权限
    this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.READ_EXTERNAL_STORAGE).then();
    昵称已被使用_:@不在三重门 之前好像是imagepicker插件有个坑.你检查一下你这两个文件是否和我一样
    https://github.com/yanxiaojun617/ionic2_tabs/blob/master/plugins/com.synconset.imagepicker/src/android/androidtarget.gradle

    https://github.com/yanxiaojun617/ionic2_tabs/blob/master/plugins/com.synconset.imagepicker/src/android/ignorelinterrors.gradle
  • shen1996:军哥 安卓8.0 fileOpener.open报错 在插件官网说是在config里添加两个权限 我添加上了没效果
  • de12d80639ce:这个install插件感觉有未知bug,第一个App可以正常安装,第二个App,插件移过来就安装不了,下载app完后无反应了~~,卸载插件再装也是~~
  • 今天是周六呀:小军,我这新版本下载了 但是不会自动弹出来提示安装 可能是什么原因呀
    今天是周六呀:@小军617
    import { FileOpener } from '@ionic-native/file-opener';
    const fileTransfer: TransferObject = this.transfer.create();
    const apk = this.file.externalRootDirectory + 'android.apk';
    // alert(apk);
    fileTransfer.download('...', apk).then(() => {
    // window['install'].install(apk.replace('file://', ''));
    this.fileOpener.open(apk,'application/vnd.android.package-archive').then...
    });
    昵称已被使用_:@今天是周六呀 file.open你做了什么处理.我之前测试不行的.贴出你的代码
    今天是周六呀:可以了 不是用的install 用的file.open就行了:smile:
  • de12d80639ce:你好,我按照你的方法更新APP,然后安装完毕后app闪退,然后要手动打开,有遇到过吗
    昵称已被使用_:@爱吃猫De鱼_534c fileOpener.open(apk)就是有这个毛病.及继续测试install插件https://link.jianshu.com/?t=https://github.com/weelion/phonegap-plugin-install.或者拷贝我项目中的插件
    de12d80639ce:@小军617 我用的fileOpener.open(apk)这个,之前用window['install'].install(apk)发现手机没反应
    昵称已被使用_:@爱吃猫De鱼_534c 你下载完打开app的方式不是用install这个插件吧
  • f81539cd3793:大神为什么版本号拿不到呢
  • 差不多先生_2517:博主大大,platform.ready().then(() => {
    // 检查APP版本
    this.appVersion.getVersionNumber().then( function(version){
    window.localStorage.setItem('appVersion',version);
    this.version = version ;
    alert(version);
    }).catch(err => {
    this.toastCtrl.presentToast('请重新尝试开启APP1');
    alert(JSON.stringify(err));
    });
    });
    我这样写直接进alert(JSON.stringify(err));报错,在app.component.ts里面的constructor写的
    差不多先生_2517:弹出的内容是:{"_zone_symbbol_currentTask":{"type":"microTask","state":"notScheduled","source":"Promise.then","zone":"angular","cancelFn":nulll,"runCount":0}} 求搭救:sob:
  • 差不多先生_2517:博主,要是有恶意用户存在一直更新下载怎么办
    昵称已被使用_:@差不多先生_2517 不考虑特殊情况,正常情况用户这个路径下怎么会有包,以前的旧的包重新安装一遍?
    差不多先生_2517:@小军617 我的想法是 点击更新的时候先去判断我的路径里有没有这个包,有就直接跳安装,没有才下载
    昵称已被使用_:@差不多先生_2517 你想好了,告诉我.:smiley:
  • 差不多先生_2517:军哥,我有个问题,我在使用cordova插件的transfer 里的 onprogress监听下载进度的方法时候获取了下载进度,发现页面的数据没有实时刷新,还有事卡住,但是我加上一个toast弹框时候却可以一直刷新,我在ts中//进度条public loadProgress : number = 0; 在onprogress里写 this.loadProgress = (res2.loaded / res2.total) * 100;
  • 差不多先生_2517:博主博主 title && (title.innerHTML = '下载进度:' + num + '%'); 这句的title&&什么意思啊
    差不多先生_2517:@小军617 明白
    昵称已被使用_:@差不多先生_2517 :sweat: 等于
    if(title){
    title.innerHTML = '下载进度:' + num + '%'
    }
  • 李佳奕:请问一下,var targetPath = cordova.file.externalRootDirectory + filename;文件下载路径在android7.0下会报错,是权限问题,那么下载路径应该如何修改呢
    昵称已被使用_:@李佳奕 https://github.com/yanxiaojun617/ionic2_tabs/blob/master/src/providers/NativeService.ts

    参考externalStoragePermissionsAuthorization方法申请权限
  • YuRi_1:install插件在oppo手机上没有反应
  • wangwanttt:https://ionicframework.com/docs/native/app-update/
    ionic3 自带更新插件了
    不在三重门:这个插件貌似不好用啊
    dml1874:你自己使用过这个插件吗,好使吗?
    wangwanttt: MyApp_Host.html:1 ERROR Error: No provider for Transfer!
  • dcab8bc5dbad:小军,请问一下,我下载完后怎么在状态栏没有显示这个下载的安装包的啊,也没有提示安装信息,然后在文件管理的下载文件夹能找到,怎么才能下载完提示安装呢?
    dcab8bc5dbad:可以了,我安装的方式改成了打开文件的方式,没用window.install,改成了this.fileOpener.open(
    apk.replace('file://', ''),
    'application/vnd.android.package-archive'
    );
  • 你看Ta好像条狗啊:你好,小军,我根据你的方法,引入cordova插件会报No provider for File!,如何解决??
    dcab8bc5dbad:小军,我下载完后怎么在状态栏没有显示这个下载的安装包的啊,也没有提示安装信息,然后在文件管理的下载文件夹能找到,怎么才能下载完提示安装呢?
    你看Ta好像条狗啊:知道问题在哪了,得将所有的cordova插件import到app.module中才行,有什么办法解决这个么,如果我每写一个service要用到cordova插件都得这样的话,不好使把。。。
  • 205ca1079ffa:安卓直接下载APP覆盖旧版本APP安装之后有些地方并不会更新,需要卸载旧APP再安装新APP才会完全更新,不懂楼主有没有遇到过这个问题,如何解决?
    昵称已被使用_:@写代码要精致 不可能出现这问题.本事就是下载最新版本覆盖旧版本
    205ca1079ffa:是不是要更改config.xml中的版本号就行了
  • 92d876578f8b:小军,你好。你说的断点调试,用的什么工具?
    昵称已被使用_:@92d876578f8b 数据线连接手机和电脑,在chrome上远程调试
  • 45134d94b238:楼主为什么我的下载进度,只显示了百分之几后就卡住了,其实也是在下载,但是进度显示不动,有没有解决的办法?
    昵称已被使用_:@破鞋儿真破 打断点调试.
  • Kathy丶Andy:楼主我想问下 根据你写的为什么更新完不会自动安装呢,而你的会自动安装呢,是不是哪里需要注意下,还有那个检测有无网络,我发现把网络断开连接之后没有了数据,连接上网络之后数据也不会更新,需要手动退出,再启动下app,有解决的办法么
  • sandnul025:您好 我 getVersion出错
    getVersionNumber:cordova_not_available
    请问 这是什么原因???
    求大神帮忙!!
    昵称已被使用_: @sandnul 需要在真机调试
  • HELLO_浪:小军,怎样能够从app中跳转到app store?
    HELLO_浪:@Ths 谢谢,我现在知道怎么跳到app store了
    Ths:window.open就可以了
    昵称已被使用_: @蜕变_SeaRan 没搞过
  • simo1990:我下载在本地安装过程中遇到问题,下面是我 的操作
    ionic cordova plugin add C:\Users\simo\Desktop\centOS/phonegap-plugin-install-master.zip
    > cordova plugin add C:\Users\simo\Desktop\centOS/phonegap-plugin-install-master.zip --save
    ✖ Running command - failed!

    [ERROR] Cordova encountered an error.
    You may get more insight by running the Cordova command above directly.

    [ERROR] An error occurred while running cordova plugin add
    C:\Users\simo\Desktop\centOS/phonegap-plugin-install-master.z... (exit code 1):

    Error: Invalid Plugin! C:\Users\simo\Desktop\centOS\phonegap-plugin-install-master.zip needs a valid
    package.json
    报错说需要有效package.json
  • 7249b62cf84a:您好,小军,这个插件cordova plugin add https://github.com/weelion/phonegap-plugin-install.git安装报错,如下:
    Error: Failed to fetch plugin https://github.com/weelion/phonegap-plugin-install
    .git via registry.
    Probably this is either a connection problem, or plugin spec is incorrect.
    Check your connection and plugin name/version/URL.
    Error: cmd: Command failed with exit code 4294963228 Error output:
    npm ERR! addLocal Could not install C:\Users\ADMINI~1\AppData\Local\Temp\npm-684
    8-ea133d5a\git-cache-f4911f53\9be022e7f19fcfadc787517823bb2b3e9ddba2dd
    npm ERR! Windows_NT 6.1.7601
    npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\
    node_modules\\npm\\bin\\npm-cli.js" "install" "https://github.com/weelion/phoneg
    ap-plugin-install.git" "--save"
    npm ERR! node v7.7.4
    npm ERR! npm v4.1.2
    npm ERR! code EISDIR
    npm ERR! errno -4068
    npm ERR! syscall read

    npm ERR! eisdir EISDIR: illegal operation on a directory, read
    npm ERR! eisdir This is most likely not a problem with npm itself
    npm ERR! eisdir and is related to npm not being able to find a package.json in
    npm ERR! eisdir a package you are trying to install.

    npm ERR! Please include the following file with any support request:
    npm ERR! C:\Users\Administrator\ruiche-app\node_modules\npm-debug.log,
    是什么原因,其它插件是安装成功了,就上面的那个安装不上,谢谢
    昵称已被使用_:@Life_b1da
    1.没有sdk会保存到根据根目录.我在小米4测试过.
    2.没遇到过啊.你要调试看apk路径是否正确
    7249b62cf84a:谢谢,小军,install插件通过同事的电脑安装上了。但有两个新问题咨询一下
    1, const apk = this.file.externalRootDirectory + 'android.apk'; //apk保存的目录,这个目录对于没有SD卡的手机是不是不能用,因为我在一个没有SD卡的手机上测试报错,但一个有Sd卡的手机可以更新下载;
    2,执行到 window['install'].install(apk.replace('file://', ''));这里时提示我解析包异常,可能的原因是什么 ?
    再次感谢啊
    昵称已被使用_:那你把插件下载到本地安装
  • 小明的锅:3、install没更新成功, fileTransfer.download(APK_DOWNLOAD, apk).then(() => {

    });这里会有问题吗? 运行时报Uncaught (in promise):【object Onject】
    jim_34d1:在then()后面添加catch()可解决
    jim_34d1:我也碰到这个问题,请问解决了吗?
  • 64b2a14de597:你这是在2.0还是2.3还是3.0上的实现,我们同事讲说file插件获取的路径都是null
    昵称已被使用_:没有安装file插件依赖吧
    cnpm i @ionic-native/file
  • iplaycodex:大佬,正好要用到升级的功能,大佬666.点赞

本文标题:ionic2实战-添加app升级功能

本文链接:https://www.haomeiwen.com/subject/ezmpzttx.html