精华内容
下载资源
问答
  • App更新策略课程-实现进度更新

    千次阅读 2016-05-02 20:25:26
    App更新策略课程-定义后台更新服务配套视频地址:App更新策略视频本节课主要是接着上面的课程继续完善App更新功能,这次主要是在后台根据下载进度,通过handler来发送消息的方式来更新进度条,具体的效果如下图所示...

    前言

    前面的课程已经实现了通过Http请求API检查更新,定义了后台下载服务实现了apk下载,如果没有看过前面的课程可以看以下博文:

    App更新策略课程-检查更新实现
    App更新策略课程-定义后台更新服务

    配套视频地址:

    App更新策略视频

    本节课主要是接着上面的课程继续完善App更新功能,这次主要是在后台根据下载进度,通过handler来发送消息的方式来更新进度条,具体的效果如下图所示:

    App进度更新

    我们要实现的效果就跟上面一样,点击更新之后,就弹出更新对话框不停的更新进度,进度达到100的时候,提示下载成功并消除对话框。

    代码片段:

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    代码已经上传,大家可以down下来:
    http://git.oschina.net/devilwwj/AndroidUpdateDemo

    展开全文
  • App更新策略课程-检查更新

    千次阅读 2016-04-12 21:56:36
    这节课来正式讲解App更新策略的第一部分,检查更新实现,本节课来教大家如何集成android-async-http这个比较优秀的网络库,由于Android6.0已经抛弃使用HttpClient这个类,所以集成这个网络库的时候一定要选择最新的...

    这节课来正式讲解App更新策略的第一部分,检查更新实现,本节课来教大家如何集成android-async-http这个比较优秀的网络库,由于Android6.0已经抛弃使用HttpClient这个类,所以集成这个网络库的时候一定要选择最新的版本,这里是1.4.9,如果大家以后想换成其他网络库,比如Volley,Okhttp再或者是retrofit这样比较流行的Http网络请求库,只要针对相应的方法替换成新的网络库的方法就行了。

    我们来看如何实现检查更新,说白了就是通过调用服务端给我们提供的API接口,我们通过网络库发送HTTP GET的请求,返回服务端的接口数据,并对它进行解析,这里一般是JSON格式的数据。

    定义接口地址常量

     // 这里替换你的服务器域名
        public static final String DOMAIN = "http://www.infzm.com/";
        // url, 检查更新API
        public static final String CHECK_UPDATE = DOMAIN
                + "mobilesource/goal/app.config.php";

    定义请求方法

      /**
         * 检查更新
         * 
         * @param params
         * @param responseHandler
         */
        public RequestHandle checkUpdate(RequestParams params,
                                         AsyncHttpResponseHandler responseHandler) {
            LogUtils.e("checkUpdate", URLHelper.CHECK_UPDATE + "?" + params);        return client.get(URLHelper.CHECK_UPDATE, params, responseHandler);

    定义回调方法

    package com.devilwwj.updateapkdemo.update;
    
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.devilwwj.updateapkdemo.GlobalSettings;
    import com.devilwwj.updateapkdemo.R;
    import com.devilwwj.updateapkdemo.utils.Utils;
    import com.loopj.android.http.JsonHttpResponseHandler;
    
    import org.apache.http.Header;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.Map;
    
    /**
     * 检查更新的句柄
     * @author wwj_748
     *
     */
    public class CheckUpdateAsyncHandler extends JsonHttpResponseHandler{
    
        private Context mContext;
    
        private ProgressDialog progressDialog;
    
        OnCheckUpdateListener checkUpdateListener;
    
        interface OnCheckUpdateListener {
            void onSuccess(UpdateInfo updateInfo);
            void onFailure();
        }
    
        public CheckUpdateAsyncHandler(Context context, OnCheckUpdateListener onCheckUpdateListener) {
            this.mContext = context;
            this.checkUpdateListener = onCheckUpdateListener;
            progressDialog = new ProgressDialog(mContext);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setMessage(mContext.getString(R.string.tip_requesting));
            progressDialog.setCancelable(true);
        }
    
        @Override
        public void onStart() {
            super.onStart();
            progressDialog.show();
        }
    
        @Override
        public void onFailure(int statusCode, Header[] headers,
                Throwable throwable, JSONObject errorResponse) {
            super.onFailure(statusCode, headers, throwable, errorResponse);
            Map<String, Object> versionInfoMap = GlobalSettings
                    .getNewVersionInfo(mContext);
    
            boolean canUpdate = (Boolean) versionInfoMap.get("updatable");
    
            if (canUpdate) {
                    progressDialog.dismiss();
                    Toast.makeText(mContext, "连接失败,请稍后重试",
                            Toast.LENGTH_SHORT).show();
            } else {
                    progressDialog.dismiss();
            }
    
            checkUpdateListener.onFailure();
        }
    
    
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            super.onSuccess(statusCode, headers, response);
            Log.d("updateInfo", response.toString());
    
            try {
                JSONObject firstObject = (JSONObject) response.get("android_ireader");
                // 获取日志更新配置
                int frequency = firstObject.optInt("frequency");
                int sendLogStatus = firstObject.optInt("send_log");
                // 最新版本号
                String versionName = firstObject.optString("app_version");
                // 版本号
                int versionCode = firstObject.optInt("version_code");
                versionCode = 47;
    
                // 更新内容
                String features = firstObject.getString("features");
                // sdk版本
                String sdkVersion = firstObject.optString("sdk_version");
                // 系统版本
                String osVersion = firstObject.optString("os_version");
    
                // 获取当前版本号
                int currentVersionCode = Utils.getAppVersionCode(mContext);
                // apk下载地址
                String url = firstObject.optString("update_url");
    
                boolean isCanUpdate;
                // 获取上次强制更新的版本——last_force_update
                int last_force_update_version = firstObject.optInt("last_force_update_version");
    
                if (currentVersionCode < last_force_update_version) {
                    isCanUpdate = true;
                } else {
                    if (versionCode <= currentVersionCode) {
                        isCanUpdate = false;
                    } else {
                        isCanUpdate = true;
                    }
                }
    
                // 保存更新信息到sharedPerences
                GlobalSettings.saveNewVersionInfo(mContext, versionName, url, features, isCanUpdate);
                UpdateInfo updateInfo = new UpdateInfo();
                updateInfo.setVersionName(versionName);
                updateInfo.setVersionCode(versionCode);
                updateInfo.setFeatures(features);
                updateInfo.setSdkVersion(sdkVersion);
                updateInfo.setOsVersion(osVersion);
                updateInfo.setUpdateUrl(url);
                updateInfo.setLastForceUpdate(last_force_update_version);
    
                checkUpdateListener.onSuccess(updateInfo);
    
            } catch(JSONException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onFinish() {
            super.onFinish();
            progressDialog.dismiss();
        }
    
        @Override
        public void onCancel() {
            super.onCancel();
            progressDialog.cancel();
        }
    }
    

    定义更新管理类

    package com.devilwwj.update.http;
    
    import android.content.Context;
    
    /**
     * com.devilwwj.update.http
     * Created by devilwwj on 16/4/5.
     */
    public class AppUpdateManager {
        private Context mContext;
    
        private static AppUpdateManager instance;
    
        public static AppUpdateManager getInstance(Context context) {
            if (instance == null) {
                synchronized (AppUpdateManager.class) {
                    instance = new AppUpdateManager(context);
                }
            }
            return instance;
        }
    
        public AppUpdateManager(Context context) {
            this.mContext = context;
        }
    
        public void checkUpdate() {
            HttpRequestHelper.getInstance().checkUpdate(null, new CheckUpdateAsyncHandler(mContext))
        }
    
    }

    调用检查更新方法

    public class MainActivity extends AppCompatActivity {
    
    
        private Button btnCheckUpdate;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btnCheckUpdate = (Button) findViewById(R.id.btn_checkupdate);
    
            btnCheckUpdate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 这里去检查更新
                    AppUpdateManager.getInstance(MainActivity.this).checkUpdate();
    
                }
            });
        }
    
    
    
    }

    最后
    本节课的内容基本上就这么多啦,代码大家可以http://git.oschina.net/devilwwj/AndroidUpdateDemo去下载,去下载,每一节课的代码都会上传到这个地方,代码会随着开发会有点变化,大家一定要跟上节奏哦。

    如果大家想看视频的话可这里:http://edu.csdn.net/course/detail/2139

    展开全文
  • 检测App 更新提示用户是否更新

    千次阅读 2017-04-01 11:29:31
    检测App 更新提示用户是否更新注意: !!!!!苹果规定了app里不能出现更新、版本之类的东西 解决方案: 你可以做个动态控制 就是单独写个接口 让后台给你传个固定的值 你加判断 只要是这个值 就隐藏 不是 就...

    检测App 更新提示用户是否更新

    注意:
    !!!!!苹果规定了app里不能出现更新、版本之类的东西
    解决方案:
    你可以做个动态控制 就是单独写个接口 让后台给你传个固定的值 你加判断 只要是这个值 就隐藏 不是 就开开 我这边就是这样弄的 审核之后再打开这个接口

    代码:
    通常iOS系统中是默认设置再wifi状态,且网络状况良好下自己更新应用的.
    但是如果用户设置了不自动更新,但是我们的APP出现重要的版本,一定需要用户更新的情况下,就会需要这个功能了.

    这个版本更新一般会有两种方式:
    1.在自己的服务器上部署上一个文件,写入版本数据,然后app去获取版本数据,与自己的当前版本比对, 提示更新
    优点:可自定义更新模式(强制更新,选择更新)
    缺点:APP审核的时间不可控
    2.去AppStore获取当前发布的版本号,与用户当前版本比对,然后提示更新.
    优点:版本更新的时间精准
    缺点:自定义空间小
    这两种方法一般推荐第2种….
    需要自定义更新模式的(强制更新,选择更新)推荐使用第一种

    //第二种
    /*版本更新检测
    284882215 (Facebook APP ID)

    //中国区,需要再.com后面加 /cn 下面已经加,测试对于外国的APP也能行

    define APP_URL @”http://itunes.apple.com/cn/lookup?id=你程序的appId”

    请求网络数据,返回的大致数据如下,其他还有好多数据,我们把关键的给截取出来

    {
    resultCount = 1;
    results = (
    {
    artistId = 开发者 ID;
    artistName = 开发者名称;
    price = 0;
    isGameCenterEnabled = 0;
    kind = software;
    languageCodesISO2A = (
    EN
    );
    trackCensoredName = 审查名称;
    trackContentRating = 评级;
    trackId = 应用程序 ID;
    trackName = 应用程序名称”;
    trackViewUrl = 应用程序介绍网址(下载地址);
    userRatingCount = 用户评级;
    userRatingCountForCurrentVersion = 1;
    version = 版本号;
    wrapperType = software;
    }
    );
    }

    取得这些数据后关键的信息就是“ version”最新版本号和“ trackViewUrl”程序下载地址。然后与本地程序的版本比较即可。
    */

    这个你可以参照下面第一种的过程都一样

    请求数据 -> 判断版本 -> 提示或不提示-> 后续操作
    //第一种

    你首先要在进入程序的时候 去请求这个数据

    /*
    responseObject的格式
    {
    iosDownload = “itms-apps://itunes.apple.com/cn/app/wang-yi-yun-yin-le-pao-bufm/id590338362?mt=8”;
    iosForce = 0; //控制强制更新
    iosUpdateMsg = “更新信息,哈哈哈

    展开全文
  • APP更新改造

    万次阅读 2018-06-17 08:43:24
     随着版本的迭代如果APP更新不改造的后,后期会有更多版本的兼容问题;发现有问题,如果其影响大一定要赶紧修复;  遇到问题有第一直觉,接下来分析会无意识在辅证这一直觉会陷入思维误区,需要跳出来,多维度...

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

    【前言】

           最近在工作中发现一些奇怪的问题,出现一些按照正常的逻辑不可能出现的情况;第一直觉是有人刷接口进来的,经过对业务流程的梳理以及数据分析得出相同结论不应该出现这种情况,并让测试同事帮忙在测试环境模拟结果相同;

           百思不得其解时,另外一同事给出猜想,有可能用户是用的老版本的APP,按照这个思路果然将发现问题所在,我们在版本迭代过程中,主流程上做过变更,用老版APP会触发不到一些流程导致的;针对本次出现问题,我们进行了紧急修复。

    【改造之旅】

            一、APP更新逻辑

                  1、后台管理配置APP更新

                       在上新版本的APP时,相关管理人员会在我们的后台配置上APP版本,以及是否强制更新,同时将其他版本的APP配置置为失效状态;

                       说明:强制更新是指检测到有新的版本必须升级否则无法继续使用APP,不强制更新是指APP在检测到有新版本时只给用户提示,用户可以取消更新;

                  2、APP及APP后台的更新接口逻辑

                      APP在每次启动时请求后台更新接口,后台去查当前配置有效的版本以及是否强更返回给APP;APP拿到后台返回的版本号和是否强更结果后,本身版本和后台返回版本做比较:

                   (1)本身版本号>=后台返回版本号,不做提醒;

                   (2)本身版本号<后台返回版本号,根据后台返回的强更给出用户相应的提示。

           二、改造逻辑梳理

                 1、问题分析:

                     出现问题是由于,在配置强制更新的版本中,用户没有打开APP;

                     比如:用户在2018年6月1日下载APP版本号是V1.0.0;

                               我们在2018年6月10日升级系统(因系统流程有更改,故不支持V1.0.0版本)于是新发版APP在后台配置 V1.0.1  强制升级;   

                               我们在2018年6月20日升级系统(系统流程没有改动,支持V1.0.1版本),于是新发版APP并在后台配置 V1.0.2 不强制升级

                     正常用户如果在2018年6月10日到2018年6月20日启动我们APP的话会升级到V1.0.1这时是兼容没问题;但是如果用户在2018年6月10日到2018年6月20日没有使用APP在2018年6月20日之后使用,这时用户可以选择不更新,这时用户还是使用的V1.0.0版本的APP,此时再做业务的时候,便会出问题;

                 2、问题修复:

                     APP请求更新接口时传入自己当前的版本号;后台去库中只要在这个版本到最新版本中有过强制更新,则返回强制更新;可以解决该问题;

                   比如以上场景:用户在2018年6月20日后使用APP原来后台返回给APP的是V1.0.3版本 不需要强制更新;现在后台会根据APP传入的V1.0.0版本检查发现V1.0.1配置强更,于是会返回V1.0.3版本,强制更新

                 3、大方向确定后,下面是程序处理逻辑;

                      (1)取当前后台配置的开启的版本,若配置是强制更新则直接返回;

                     (2)若不是强制更新,则去库中把所有配置是强更的版本拿到,判断如果有比APP传入的版本大,则将结果修改为强更返回;

           三、版本比较

                1、在数据库中版本号是以varchar类型存储,存储形式:1.0.0   1.0.1等,如果不做处理用字符串来比会出问题,因为对字符串处理是按ASCII码处理的;比如:在比较1.0.9和 1.0.10 时,因为9的ASCII码>1的ASCII码,于是得到1.0.9>1.0.10,显然不正确;

                2、在程序中可以通过正则表达式按照.切割后转换成数字进行比较,相应工具类如下:    

    /**
         * 比较版本号的大小
         *
         * @param version1 版本 1
         * @param version2 版本 2
         * @return 版本1大则返回一个正数, 版本2大返回一个负数, 相等则返回0
         */
        public static int compareVersion(String version1, String version2) throws Exception {
            if (version1 == null || version2 == null) {
                throw new Exception("compareVersion error:illegal params.");
            }
            String[] versionArray1 = version1.split("\\.");//注意此处为正则匹配,不能用".";
            String[] versionArray2 = version2.split("\\.");
            int idx = 0;
            int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值
            int diff = 0;
            while (idx < minLength
                    && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度
                    && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符
                ++idx;
            }
            //如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
            diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
            return diff;
        }

    【总结】

           随着版本的迭代如果APP更新不改造的后,后期会有更多版本的兼容问题;发现有问题,如果其影响大一定要赶紧修复;

           遇到问题有第一直觉,接下来分析会无意识在辅证这一直觉会陷入思维误区,需要跳出来,多维度的去看问题,找到问题的根源所在;往往有种拨开云雾见青天的妙感。

    展开全文
  • App更新策略课程-测试和总结

    千次阅读 2016-06-04 18:28:28
    App更新策略课程一共有六节,本节是最后一节,将会给大家总结一下我们App更新的时候有那些常见场景,并依据这些场景简单编写一下测试用例,还将会和大家探讨一下app更新模块还可以继续扩展什么功能。如果没有看过...
  • 上节课给大家介绍了如何实现下载进度更新,本节课将会给大家介绍如何实现通知栏消息提醒和通知栏的下载进度更新,如果还没有学习前面的课程的同学可以先学习前面内容:App更新策略课程-检查更新实现 App更新策略...
  • hbuilder app更新

    千次阅读 2018-10-14 10:44:58
    var btn = [“确定升级...//获取app系统更新[是否手动点击获取更新] function appUpdate(ismanual) { console.log('appUpdate'); mui.plusReady(function () { plus.runtime.getProperty(plus.runtime.appid, f...
  • Flutter app 更新

    千次阅读 2019-05-28 03:31:48
    在ios,只能提醒去 App Store 官网下载。 步骤一 创建一个 Updater 类。 获取线上最新的版本号与本地版本号。 通过字符串 hashCode 比较版本号是否一致。 如果不一致,那么弹出更新对话框。 更新提醒对话框我们一天...
  • // 检查更新 //#ifdef APP-PLUS plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => { var version = wgtinfo.version // 客户端版本号 let update = { url: this.$URL + '/api/.
  • 带你使用uni-upgrade-center搭建APP更新系统(升级中心+应用升级) 爽的要死
  • 公司最近准备开发一款小应用,需要先调查一下Android平台和IOS平台application的更新机制的区别,没有移动app的开发经验,公司计划用开源跨平台框架Apache codova,希望有经验的大牛分享一下俩个平台的app更新机制...
  • 提交APP到 应用商店审核, 报这么一个错误: 提交至APP STORE的APP和APP更新必须使用Xcode5.1.1(或更高级版本)及ios 7 sdk进行构建 网上搜索, 没找到合适的答案, 请教群友才知, 我使用的xcode 6.2 beta 版本, 而...
  • App更新进度显示在后台通知栏详解

    千次阅读 2016-12-14 22:01:59
     最近在项目中遇到App更新的问题,老大让更新进度直接显示在后台通知栏中,以前我都是用ProgressDialog撸成的,话说用户体验不好,要改成后台通知栏效果,好吧,谁让我不是老大的!改呗...今天就后台通知栏显示更新...
  • Retrofit实现App更新

    千次阅读 2016-06-01 00:07:26
    Github代码:https://github.com/SpikeKing/wcl-update-request-demo逻辑访问服务器, 根据是否包含新版本, 判断是否需要更新. 下载Apk, 下载完成后, 自动安装, 高版本会覆盖低版本.逻辑:public class MainActivity ...
  • iOS-app更新和强制更新

    千次阅读 2017-03-09 15:04:10
    如出现重大更新,如果用户不更新,这个app都用不下去了。这个时候就要强制用户更新。 2. 第二位作为功能版本号。比如增加了一些新的功能。这个时候通过增加这个版本号,来添加功能。 3. 第三位作为修订版本号。如...
  • 关于app更新升级的方法

    万次阅读 2018-02-28 15:24:44
    App更新升级是所有移动开发人员都要去了解的东西,这篇文章只是留给自己的笔记,希望能帮到大家。在这里总共描述了基本的三种更新方式:本地、第三方更新、热更新。1.本地更新: 其实就是在app启动的时候通过向...
  • Android 蒲公英APP更新

    千次阅读 2019-07-11 16:39:01
    使用APP更新需要有WRITE_EXTERNAL_STORAGE权限,6.0以上需要动态申请,不然会一直提示更新失败 具体参考我另一篇: https://blog.csdn.net/qq_26446715/article/details/95482706 (2)实现版本检测和更新 ...
  • flutter APP下载或 APP更新的几种方法

    千次阅读 2020-06-23 09:54:30
    我这里使用的是dio下载 ,使用install_plugin 安装apk ,ios则跳转到 app stor /// 下载apk Future<File> _downloadApk(String datasource) async { /// 创建文件 Directory stora...
  • Android app更新适配安卓10、11版本

    千次阅读 2021-03-25 17:59:15
    Android app内部更新适配安卓10、11版本 前言 ​ App内部更新现在基本每个app中都有,由于安卓各大应用市场不统一,不像Ios那样只有一个应用商城。并且现在安卓已经更新到11版本了,中间有几个版本还需对App内部更新...
  • ----uni-app之APP更新及静默更新----

    千次阅读 2019-05-05 20:47:00
    1.在APP.vue中的onLaunch中向后台请求数据   2.在index.vue中进行取值判断 注:安卓在更新时下载完成后只有安装的权限,没有读包的权限,故在manifest。json文件中配置读的权限 转载于:...
  • App更新策略课程-定义后台更新服务

    千次阅读 2016-04-18 22:45:04
    上节课给大家讲了,如何实现检查更新,通过Android-async-http这个网络库进行Http请求服务器API,响应返回更新信息。这节课来将如何通过绑定一个Service来启动一个服务,并通过它来下载我们的Apk文件。首先我们创建...
  • 最骚气的APP更新文案盘点

    万次阅读 2017-11-06 00:00:00
    因为手机里 下了超多APP 每次打开AppStore都会很...所以我一般更新APP都会很谨慎 会看看更新了哪些东西 不到万不得已绝不更新 无意中发现现在这些APP 连个更新文案都骚气十足啊 不信就来感受一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,364
精华内容 14,545
关键字:

app更新