精华内容
下载资源
问答
  • IONIC 自动更新APP版本

    千次阅读 2015-11-17 14:54:27
    1、准备工作,添加插件 1.1、添加获取APP版本信息插件 ionic plugin add ...2.2、添加APP自动更换插件 ionic plugin add cordova-plugin-file ionic plugin add cordova-plugin-file-transfer ionic plugin ad

    1、准备工作,添加插件


    如果cordova 未添加请先执行以下命令
    	1、npm install bower -g //安装bower  
    	2、bower install ngCordova   //安装cordova


    1.1、添加获取APP版本信息插件

    ionic plugin add cordova-plugin-app-version

    2.2、添加APP自动更新相关插件

        ionic plugin add cordova-plugin-file  
        ionic plugin add cordova-plugin-file-transfer  
        ionic plugin add cordova-plugin-file-opener2

    2、在APP一运行的时候就进行检查版本信息(在run方法添加如下代码)

    .run(function($ionicPlatform, $http, $rootScope, $ionicActionSheet, $timeout, $cordovaAppVersion,  
            $ionicPopup, $ionicLoading, $cordovaFileTransfer, $cordovaFile, $cordovaFileOpener2) {  
        $ionicPlatform.ready(function() {  
            // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard  
            // for form inputs)  
            if (window.cordova && window.cordova.plugins.Keyboard) {  
                cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);  
            };  
            if (window.StatusBar) {  
                StatusBar.styleDefault();  
            };  
            //服务器上保存版本信息
            $http.get('http://localhost/app/ver.json')  
            .then(function(data){  
                var serverAppVersion = data.data.verInfo;//服务器 版本  
                console.log("====>>服务器"+serverAppVersion);  
                $cordovaAppVersion.getVersionNumber().then(function(version) {  
                    console.log("version=====本机>>>"+version+"====>>服务器"+serverAppVersion);  
                    if (version != serverAppVersion) {  
                        $ionicLoading.show({  
                            template: "已经下载:0%"  
                        });  
                        var url = "http://192.168.1.77:8080/app/android-debug.apk";   
                        var targetPath = "file:///mnt/sdcard/Download/android-debug.apk";   
                        var trustHosts = true  
                        var options = {};  
                        $cordovaFileTransfer.download(url, targetPath, options, trustHosts).then(function (result) {  
                            $cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive'  
                            ).then(function () {  
                                }, function (err) {  
                                });  
                            $ionicLoading.hide();  
                        }, function (err) {  
                            alert('下载失败');  
                        }, function (progress) {                             
                            $timeout(function () {  
                                var downloadProgress = (progress.loaded / progress.total) * 100;  
                                $ionicLoading.show({  
                                    template: "已经下载:" + Math.floor(downloadProgress) + "%"  
                                });  
                                if (downloadProgress > 99) {  
                                    $ionicLoading.hide();  
                                }  
                            })  
                        });  
                    }  
                });  
            });  
              
        });  
          
    })

    3、在服务端webapp下添加以下两个文件

    	1、ver.json
    	2、Android-debug.apk


    展开全文
  • App Key:唯一标识一个应用的 Key,在蒲公英上的每一个 App 都有一个唯一的 App Key,开发者可以在应用管理页面首页查看。 2.导入SDK 1> 在project下的build.gradle文件中: allprojects { ...

    一、蒲公英基础使用方法

    1.在蒲公英上注册应用获取App Key

    App Key:唯一标识一个应用的 Key,在蒲公英上的每一个 App 都有一个唯一的 App Key,开发者可以在应用管理页面首页查看。

    2.导入SDK

    1> 在project下的build.gradle文件中:

    allprojects {
        repositories {
            jcenter()
            maven { url "https://raw.githubusercontent.com/Pgyer/mvn_repo_pgyer/master" }
        }
    }

    2> 在module下的build.gradle文件中添加依赖:

    dependencies {
        compile 'com.pgyersdk:sdk:2.8.1'
    }

    3.配置AndroidManifest

    <!-- 必选-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  <!-- 获取设备信息 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取MAC地址-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读写sdcard,storage等等 -->
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    
    <!-- 必选-->
        <meta-data
            android:name="PGYER_APPID"
            android:value="第一步中申请到的App Key" >
        </meta-data>
    </application>

    4.更新方法

    import com.pgyersdk.javabean.AppBean;
    import com.pgyersdk.update.PgyUpdateManager;
    import com.pgyersdk.update.UpdateManagerListener;
    
    PgyUpdateManager.register(MainActivity.this,
    new UpdateManagerListener() {
    
       @Override
       public void onUpdateAvailable(final String result) {
    
         // 将新版本信息封装到AppBean中
         final AppBean appBean = getAppBeanFromString(result);
         new AlertDialog.Builder(MainActivity.this)
             .setTitle("更新")
             .setMessage("")
             .setNegativeButton(
                     "确定",
                     new DialogInterface.OnClickListener() {
    
                         @Override
                         public void onClick(
                                 DialogInterface dialog,
                                 int which) {
                             startDownloadTask(
                                     MainActivity.this,
                                     appBean.getDownloadURL());
                         }
                     }).show();
       }
    
       @Override
       public void onNoUpdateAvailable() {
       }
    });
    
    //解除注册
    PgyUpdateManager.unregister();

    二、蒲公英自动更新机制

    蒲公英 SDK 的更新,是根据 App 本身的版本号和蒲公英自增 Build 版本号来判定更新的。这两个版本号中,任何一个检查到线上版本大于本地版本,都会提示更新。

    具体判定顺序是:

    第一步: 如果本地 App 本身的版本号小于蒲公英上的版本号,则提示更新。(注意:App 的本地版本号是指 VersionCode)

    第二步: 如果本地 App 的蒲公英自增 Build 版本号(每上传一个新版本的应用则自动加1)小于蒲公英上版本的自增 Build 号,则提示更新。

    在这两步中,任何一步如果判断出有新版本,都会提示更新。否则不会提示。

    注意事项:

    因为蒲公英的自增 Build 版本号 是不写入 App 内的。所以,对于手机上首次安装 App 来说,无论安装的是蒲公英上的哪个版本,SDK 都会认为该 App 本地的蒲公英自增 Build 版本号是当前蒲公英上最新版本的自增 Build 版本号。

    因此,在 SDK 第一次启动时,会检查本地是否存在 蒲公英自增 Build 版本号,如果不存在,会调用蒲公英接口将最新的蒲公英自增 Build 版本号写入本地文件中,以便下次用于版本更新的判断。

    展开全文
  • android app自动更新功能的实现
  • flutter APP自动更新

    千次阅读 2020-08-14 14:03:58
    flutter APP自动更新前言在pubspec.yaml中安装依赖在main.dart文件中,初始化FlutterDownLoader配置网络在AndroidManifest.xml新增如下配置在项目入口dart文件中,新增自动更新逻辑代码效果图 前言 近期做flutter ...

    前言

    近期做flutter APP框架的搭建封装,在APP自动更新这块,参考了很多网址,但都不全面;故自己动手封装了一套,主要采用flutter_downloader及progress_dialog等;在APP启动成功后,若有最新版本,便会自动弹框提示是否更新,若更新,将会下载最新APP,并显示下载进度,下载完成后,将自动提示是否安装最新包。
    此功能主要针对android APP自动更新

    在pubspec.yaml中安装依赖

         permission_handler: 5.0.0+hotfix.4
         package_info: 0.4.1
         path_provider: 1.6.11
         open_file: 3.0.1
         flutter_downloader: 1.5.0
         progress_dialog: 1.2.0
    

    在控制台输入 flutter packages get 命令,下载依赖包

    在main.dart文件中,初始化FlutterDownLoader

      ...
      import 'package:flutter_downloader/flutter_downloader.dart';
      
      ...
    
      
      void main() async {
        WidgetsFlutterBinding.ensureInitialized();
        await FlutterDownloader.initialize(
          debug: true
        );
        runApp(MyApp());
      }
    
      ....
    
    

    配置网络

    在android/app/src/main/res目录下,新建文件夹xml,在xml文件夹下,新增network_security_config.xml
    在network_security_config.xml中写入以下代码

     <?xml version="1.0" encoding="utf-8"?>
        <network-security-config>
            <base-config cleartextTrafficPermitted="true">
                <trust-anchors>
                    <certificates src="system" />
                </trust-anchors>
            </base-config>
        </network-security-config>
    

    如下图:
    在这里插入图片描述

    在AndroidManifest.xml新增如下配置

    1. 新增权限
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
      <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
    1. 在<application …>中新增network_security_config配置
      <application
            android:name="io.flutter.app.FlutterApplication"
            android:label="flutter助手"
            android:icon="@mipmap/ic_launcher"
            android:networkSecurityConfig="@xml/network_security_config"
        >
    
    

    如下图:
    在这里插入图片描述
    3. 在<application …>标签内加入以下代码

          <provider
                android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
                android:authorities="${applicationId}.flutter_downloader.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
    		
    		 <provider
                android:name="androidx.work.impl.WorkManagerInitializer"
                android:authorities="${applicationId}.workmanager-init"
                android:enabled="false"
                android:exported="false" />
    
            <provider
                android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"
                android:authorities="${applicationId}.flutter-downloader-init"
                android:exported="false">
                <!-- changes this number to configure the maximum number of concurrent tasks -->
                <meta-data
                    android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"
                    android:value="5" />
            </provider>
    
    
            <provider
                    android:name="androidx.core.content.FileProvider"
                    android:authorities="${applicationId}.fileProvider"
                    android:exported="false"
                    android:grantUriPermissions="true"
                    tools:replace="android:authorities">
                <meta-data
                        android:name="android.support.FILE_PROVIDER_PATHS"
                        android:resource="@xml/filepaths"
                        tools:replace="android:resource" />
            </provider>
    

    如下图:
    在这里插入图片描述

    在项目入口dart文件中,新增自动更新逻辑代码

    1. 导入相关包
      import 'dart:isolate';
      import 'dart:ui';
      import 'dart:async';
      import 'dart:io';
    
      import 'package:package_info/package_info.dart';
      import 'package:path_provider/path_provider.dart';
      import 'package:open_file/open_file.dart';
      import 'package:flutter_downloader/flutter_downloader.dart';
      import 'package:progress_dialog/progress_dialog.dart';
    
    
    1. 声明变量
     String serviceVersionCode = '';
      String appId = '';
      ProgressDialog pr;
      String apkName ='app-release.apk';
      String appPath = '';
      ReceivePort _port = ReceivePort();
    
    1. 在initState中初始化

       IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
       _port.listen(_updateDownLoadInfo);
       FlutterDownloader.registerCallback(_downLoadCallback);
      
    2. 判断,自动更新

     @override
      void afterFirstLayout(BuildContext context) {
        // 如果是android,则执行热更新
        if(Platform.isAndroid){
           _getNewVersionAPP(context);
        }
       
      }
    
    1. 自动更新代码
     /// 执行版本更新的网络请求
      _getNewVersionAPP(context) async {
         HttpUtils.send(
          context,
          'http://update.rwworks.com:8088/appManager/monitor/app/version/check/flutterTempldate',
        ).then((res) {
           serviceVersionCode = res.data["versionNo"];
           appId = res.data['id'];
          _checkVersionCode();
        });
      }
      
      /// 检查当前版本是否为最新,若不是,则更新
      void _checkVersionCode() {
        PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
          var currentVersionCode = packageInfo.version;
          if (double.parse(serviceVersionCode.substring(0,3))> double.parse(currentVersionCode.substring(0,3))) {
            _showNewVersionAppDialog();
          }
       });
      }
      
      /// 版本更新提示对话框
      Future<void> _showNewVersionAppDialog() async {
        return showDialog<void>(
            context: context,
            barrierDismissible: false,
            builder: (BuildContext context) {
              return AlertDialog(
                title: new Row(
                  children: <Widget>[
                    new Padding(
                        padding: const EdgeInsets.fromLTRB(30.0, 0.0, 10.0, 0.0),
                        child: new Text("发现新版本"))
                  ],
                ),
                content: new Text(
                    serviceVersionCode
                ),
                actions: <Widget>[
                  new FlatButton(
                    child: new Text('下次再说'),
                    onPressed: () {
                      Navigator.of(context).pop();              
                    },
                  ),
                  new FlatButton(
                    child: new Text('立即更新'),
                    onPressed: () {
                      _doUpdate(context);           
                    },
                  )
                ],
              );
            });
    
      }
    
    
     /// 执行更新操作
      _doUpdate(BuildContext context) async {
        Navigator.pop(context);
         _executeDownload(context);
      }
      
      /// 下载最新apk包
      Future<void> _executeDownload(BuildContext context) async {
           pr = new ProgressDialog(
            context,
            type: ProgressDialogType.Download, 
            isDismissible: true, 
            showLogs: true,
          );
          pr.style(message: '准备下载...');
          if (!pr.isShowing()) {
            pr.show();
          }
    
          final path = await _apkLocalPath;
          await FlutterDownloader.enqueue(
            url: 'http://update.rwworks.com:8088/appManager/monitor/app/appload/' + appId + '',
            savedDir: path,
            fileName: apkName,
            showNotification: true,
            openFileFromNotification: true
          );
        }
        
       /// 下载进度回调函数
        static void _downLoadCallback(String id, DownloadTaskStatus status, int progress) {
          final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port');
          send.send([id, status, progress]);
        }
        
        /// 更新下载进度框
        _updateDownLoadInfo(dynamic data) {
          DownloadTaskStatus status = data[1];
          int progress = data[2];
          if (status == DownloadTaskStatus.running) {
            pr.update(progress: double.parse(progress.toString()), message: "下载中,请稍后…");
          }
          if (status == DownloadTaskStatus.failed) {
            if (pr.isShowing()) {
              pr.hide();
            }
          }
    
          if (status == DownloadTaskStatus.complete) {
            if (pr.isShowing()) {
              pr.hide();
            }
            _installApk();
          }
        }
       
        /// 安装apk
        Future<Null> _installApk() async {
           await OpenFile.open(appPath + '/' + apkName);
        }
        
        /// 获取apk存储位置
        Future<String> get _apkLocalPath async {
          final directory = await getExternalStorageDirectory();
          String path = directory.path  + Platform.pathSeparator + 'Download';;
          final savedDir = Directory(path);
          bool hasExisted = await savedDir.exists();
          if (!hasExisted) {
            await savedDir.create();
          }
          this.setState((){
              appPath = path;
          });
          return path;
        }
    
    

    效果图

    在这里插入图片描述

    展开全文
  • Android实现App版本自动更新

    万次阅读 多人点赞 2016-11-03 11:44:08
    例如斗鱼TV App设置界面下:   当我们点击检查更新的时候,就会向服务器发起版本检测的请求。一般的处理方式是:服务器返回的App版本与当前手机安装的版本号进行对比。 (1)如果服务器所返回的版本号大于当前App...

    现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:

                    

    当我们点击检查更新的时候,就会向服务器发起版本检测的请求。一般的处理方式是:服务器返回的App版本与当前手机安装的版本号进行对比。

    (1)如果服务器所返回的版本号大于当前App版本号那么此时手机所安装的App不是最新版。可以提示用户升级。

    (2)如果不大于当前版本号,可以提示用户为最新版本:

                  

    版本升级,也分为两种处理方式:

    (1)跳转到App某市场(例如:360手机助手

    展开全文
  • web打包app(h5+app)版本自动更新的实现

    千次阅读 2019-09-11 17:19:56
    文章目录背景说明原生app自动更新实现android自动更新实现ios自动更新实现h5+app的特点说明h5+app自动更新实现 背景说明 web打包的app(也称为h5+app),是指将基于html5等移动端web技术,开发的web应用打包成的app。...
  • iOS APP版本自动更新

    千次阅读 2018-07-12 17:20:13
    1.版本自动更新一般采用API对应的方式 获取当前App Store上版本号 于本地存储的版本号对比 2.由服务端返回版本控制升级(容易审核不通过) 参考地址(很详细) ...   想省事的小伙伴们可以直接下载下面文件 ...
  • 我用自动更新APP代码时,开始用的是以下代码 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"+Constants.SDK_DIR +File.separator+Constants.SDK_NAME), ...
  • app内部自动更新

    千次阅读 2016-07-05 11:09:58
    12306的app可以绕过appstore直接更新?这个“更新”真的是更新吗? 答案很简单:12306是一个webapp 内部功能都是通过web来实现的 更新其实是在下载html 样式 js 等等一些资源 下好了之后 webview 重新加载即可。 ...
  • [Phonegap+Sencha Touch] 移动开发77 Cordova Hot Code Push插件实现自动更新App的Web内容 标签: androidwebappcordovaphonegapweb应用 2016-03-10 17:26 7993人阅读 评论(25) 收藏 举报 本文章已收录于: ...
  • 轻松实现APP自动检测更新

    万次阅读 热门讨论 2016-08-24 02:07:47
    概述:为了让以快速并且节约的方式让APP更新新版本,通常需要在APP内增加自动检测更新新版本的功能。 运行截图:   实现:4个步骤 1.在服务端放置存储版本信息的文件  一般以json格式保存必要的信息...
  • 简单实现安卓app自动更新功能

    万次阅读 多人点赞 2016-03-01 13:25:18
    实现简单安卓app自动更新: 1.服务端提供接口 2.客户端获取接口数据,解析,获取最新版本信息 3.安装最新版本
  • 安卓app自动更新功能完美实现

    万次阅读 多人点赞 2018-11-15 16:53:39
    //判断版本是否最新,如果不是最新版本则更新 private void test(){ Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception...
  • Android实现app内部自动检测版本更新自动安装及数据库更新升级1、apk更新流程2、获取本地app内部版本工具类3、请求服务器获取版本数据及新旧版本比对4、下载最新版本apk5、监听下载是否完成并自动安装6、在...
  • 准备之前先用qq创建个bugly账号,把你的app上传上去,能得到一个appid。...//腾讯bugly 自动更新 implementation 'com.tencent.bugly:crashreport_upgrade:latest.release'//其中latest.release...
  • Android如何实现APP自动更新

    万次阅读 2016-11-17 11:02:04
    对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的麻烦,单纯指上传APP到各大应用市场的工作量就已经很大了...
  • android APP自动增量更新

    千次阅读 2018-09-17 21:10:07
    APP自动增量更新 抽取的android更新组件,觉得不错的话github上欢迎Star,欢迎Fork~ 博客同步自:个人博客主页 代码github: https://github.com/itlwy/AppSmartUpdate 目录 功能介绍 流程图 效果图与示例...
  • 关于mui开发的APP自动更新的问题

    千次阅读 2018-09-15 14:56:02
    关于APP自动更新的问题,可是有点坑啊,以下就是我遇到的问题 话不多说,直接上代码 1.先进行获取手机APP当前的信息 const wgtVer = null; //获取当前版本号 plus.runtime.getProperty(plus....
  • uniapp app内实现自动更新

    万次阅读 2019-04-15 18:19:25
    //注意:安卓9.0以上的手机需要在manifest 》app模块权限配置里面勾选PACKAGES 权限不然会无法安装 onLoad(){ this.plusReady(); this.isandroid(); }, methods: { // 获取当前版本号 ...
  • Appstore检查自动更新时间

    千次阅读 2015-12-16 23:31:55
    先介绍一下Appstore检查自动更新。 这玩意是整个手机包括系统中最最最费电最恶心最没用的功能!!appstore自动检测软件更新,超级费电,你问为什么?我来解释。这玩意不是伪后台,有一个常驻后台进程,每隔4小时...
  • 需求: app打开时自动检测是否是最新版本,如果不是出现弹框,点击升级
  • 安卓APP版本更新自动打开

    千次阅读 2016-09-19 10:47:50
    安卓APP自动更新版本功能及安装完成后自动打开
  • AS以前默认都是安装完APP之后自动打开APP的,现在每次安装完成之后都要手动点开比较麻烦,是不是我在哪里设置搞错了,求救!AS报错不能启动APP![图片说明]...
  • H5app自动更新思路与实现

    千次阅读 2016-02-19 15:15:57
    "state": "yes",//是否自动更新 "mark": "1.0.6",//版本号 "url": "http:\/\/XXXXXXXX\/APPobject\/mmm.apk"//更新的应用下载地址 } 2.自动更新函数 t是你当前正在运行的APP的版本号 //检查自动更新 function ...
  • h5+实现APP自动下载更新(hbuilder)

    万次阅读 2017-07-04 15:21:57
    这里的自动更新并非是热更新,而只是单纯检测服务器上是否有新的版本,如果有则下载安装。思路:在服务器中配置一个版本文件:xxx.json{ update:’yes’,//是否自动更新 version:’1.0.8’,//最新的版本号 url:’...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 897,295
精华内容 358,918
关键字:

如何设置自动更新app