精华内容
下载资源
问答
  • 上篇博客写了用DownloadManager,进行下载,结果发现有些手机能兼容,查找原因是DownloadManager.Request 的setDestinationInExternalPublicDir()函数问题,这直接根源挂钩,Request 有个默认路径,导致...

    上篇博客写了用DownloadManager,进行下载,结果发现有些手机并不能兼容,查找原因是DownloadManager.Request 的setDestinationInExternalPublicDir()函数问题,这直接根源挂钩,Request 有个默认路径,导致android 7.0的不兼容,具体原因不说,你们也应该知道了(API 禁止向您的应用外公开 file://URI,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider类。 如需有关权限和共享文件的更多信息。)那,您说该怎么玩呢?那我们就用原始的HttpURLConnection 下载呗,你想呀,无非就是下载一个文件而已。

    多的不说直接上代码,下面是个工具类直接用就可以:

    public class UpdataAPP {
    public Context context;
    private ProgressDialog pBar;
    private DownloadApkAsyncTask mAsyncTask = null;
    private int apkSzie;
    
    public UpdataAPP(Context context) {
        this.context = context;
    }
    
    /**
     * 版本更新----起
     */
    // 更新版本要用到的一些信息
    public void updateAPP(String url) {
        mAsyncTask = new DownloadApkAsyncTask();
        mAsyncTask.execute(url);
        pBar=new ProgressDialog(context);
        pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pBar.setTitle("正在下载");
        pBar.setMessage("请稍候...");
        pBar.setCanceledOnTouchOutside(false);
        pBar.setProgress(0);
        pBar.show();
    }
    
    
    class DownloadApkAsyncTask extends AsyncTask<String, Integer, Integer> {
    
        private static final int DOWNLOAD_OK = 0x00;
        private static final int DOWNLOAD_ERROR = 0x01;
    
        private File apkFile = null;
        private File updateDir = null;
    
        public DownloadApkAsyncTask() {
            super();
        }
    
        @Override
        protected Integer doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
                connection.setConnectTimeout(15000);
                InputStream in = connection.getInputStream();
                int curSize = 0;
                int progress = 0;
                int totalSize = connection.getContentLength();
                apkSzie=totalSize;
                pBar.setMax(totalSize); // 设置进度条的总长度
                if (android.os.Environment.MEDIA_MOUNTED
                        .equals(android.os.Environment
                                .getExternalStorageState())) {
                    updateDir = new File(Environment
                            .getExternalStorageDirectory().getPath()
                            + "/townnet/apk/");
                } else {
                    updateDir = new File("/data/data/" + context.getPackageName()
                            + "/apk/");
                }
                if (!updateDir.exists()) {
                    updateDir.mkdirs();
                }
                apkFile = new File(updateDir.getPath(), "townnet.apk");
                if (apkFile.exists()) {
                    apkFile.delete();
                }
                // 修改文件夹及安装包的权限,供第三方应用访问
                try {
                    Runtime.getRuntime().exec(
                            "chmod 705 " + updateDir.getPath());
                    Runtime.getRuntime().exec("chmod 604 " + apkFile.getPath());
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                int temp;
                byte[] bytes = new byte[1024];
                FileOutputStream out = new FileOutputStream(apkFile);
                while ((temp = in.read(bytes)) != -1) {
                    out.write(bytes, 0, temp);
                    curSize += temp;
                    progress = curSize * 100 / totalSize;
                    publishProgress(curSize);
                }
                in.close();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
                return DOWNLOAD_ERROR;
            }
            return DOWNLOAD_OK;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
            if (result == DOWNLOAD_OK) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                Uri photoURI = FileProvider.getUriForFile(context,
                        context.getPackageName() + ".provider", new File(apkFile.getPath())
                );
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
                if (Build.VERSION.SDK_INT >= 24) {
    
                    intent.setDataAndType(photoURI, "application/vnd.android.package-archive");
    
                } else {
                    intent.setDataAndType(Uri.parse("file://" + apkFile.getPath()),
                            "application/vnd.android.package-archive");
                }
                context.startActivity(intent);
            }
        }
    
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            pBar.setProgress(values[0]); // 这里就是关键的实时更新进度了!
            if (pBar.getProgress()==apkSzie){
                pBar.cancel();
            }
        }
    
        @Override
        protected void onCancelled() {
            super.onCancelled();
            if (pBar!=null){
                pBar.cancel();
            }
    
        }
    
    }
    

    }

    那你说怎么用呢?很简单呀。

    //开始下载
    new UpdataAPP(mContext).updateAPP(apkDownLoadUrl);

    下面是:AndroidManifest.xml的FileProvider:

    <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
    

    xml下的filepaths:

    这里写图片描述

    展开全文
  • 拿着项目给客户测试,客户那边三个人俩人水果手机是ios8以下版本,结果导致```(恭喜,坑出现!)总能说老总!“您把版本升级到ios9 吧!

        拿着项目给客户测试,客户那边三个人俩人水果手机是ios8以下版本,结果导致```(恭喜,坑出现!)总不能说老总!“您把版本升级到ios9 吧!?”

    首先是flex,我想应该好多人都知道这个。就像之前的position:fixed;一样。作为新人来讲,遇到这些是好的,在脱坑中成长,虽说都是被前辈们踩过的坑。

    flex:This value causes an element to generate a block-level flex container box.

            此值会导致一个元素生成一个块级框flex容器。

    一.W3C各个版本的flex

    2009 version

    标志:display: box; or a property that is box-{*} (eg. box-pack)

    2011 version

    标志:display: flexbox; or the flex() function or flex-pack property

    2012 version

    标志:display: flex/inline-flex; and flex-{*} properties

    2014 version

    新增了对flex项z-index的规定

    2015 W3C Editor’s Draft

    没有大的改动

    P.S.注意2015的是W3C Editor’s Draft,只是个草案,还处于修修改改的阶段,还没有征集浏览器供应商的意见

    浏览器兼容的flex语法

    上面分析得很清楚,针对需要兼容的目标使用对应版本的语法就好了,下面给出常用的布局代码:

     

    /* 子元素-平均分栏 */
    .flex1 {
    -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */
    -moz-box-flex: 1; /* OLD - Firefox 19- */
    width: 20%; /* For old syntax, otherwise collapses. */
    -webkit-flex: 1; /* Chrome */
    -ms-flex: 1; /* IE 10 */
    flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */
    }
    /* 父元素-横向排列(主轴) */
    .flex-h {
    display: box; /* OLD - Android 4.4- */
    display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
    display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
    display: -ms-flexbox; /* TWEENER - IE 10 */
    display: -webkit-flex; /* NEW - Chrome */
    display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
    /* 09版 */
    -webkit-box-orient: horizontal;
    /* 12版 */
    -webkit-flex-direction: row;
    -moz-flex-direction: row;
    -ms-flex-direction: row;
    -o-flex-direction: row;
    flex-direction: row;
    }
    /* 父元素-横向换行 */
    .flex-hw {
    /* 09版 */
    /*-webkit-box-lines: multiple;*/
    /* 12版 */
    -webkit-flex-wrap: wrap;
    -moz-flex-wrap: wrap;
    -ms-flex-wrap: wrap;
    -o-flex-wrap: wrap;
    flex-wrap: wrap;
    }
    /* 父元素-水平居中(主轴是横向才生效) */
    .flex-hc {
    /* 09版 */
    -webkit-box-pack: center;
    /* 12版 */
    -webkit-justify-content: center;
    -moz-justify-content: center;
    -ms-justify-content: center;
    -o-justify-content: center;
    justify-content: center;
    /* 其它取值如下:
    align-items 主轴原点方向对齐
    flex-end 主轴延伸方向对齐
    space-between 等间距排列,首尾不留白
    space-around 等间距排列,首尾留白
    */
    }
    /* 父元素-纵向排列(主轴) */
    .flex-v {
    display: box; /* OLD - Android 4.4- */
    display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
    display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
    display: -ms-flexbox; /* TWEENER - IE 10 */
    display: -webkit-flex; /* NEW - Chrome */
    display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
    /* 09版 */
    -webkit-box-orient: vertical;
    /* 12版 */
    -webkit-flex-direction: column;
    -moz-flex-direction: column;
    -ms-flex-direction: column;
    -o-flex-direction: column;
    flex-direction: column;
    }
    /* 父元素-纵向换行 */
    .flex-vw {
    /* 09版 */
    /*-webkit-box-lines: multiple;*/
    /* 12版 */
    -webkit-flex-wrap: wrap;
    -moz-flex-wrap: wrap;
    -ms-flex-wrap: wrap;
    -o-flex-wrap: wrap;
    flex-wrap: wrap;
    }
    /* 父元素-竖直居中(主轴是横向才生效) */
    .flex-vc {
    /* 09版 */
    -webkit-box-align: center;
    /* 12版 */
    -webkit-align-items: center;
    -moz-align-items: center;
    -ms-align-items: center;
    -o-align-items: center;
    align-items: center;
    }
    /* 子元素-显示在从左向右(从上向下)第1个位置,用于改变源文档顺序显示 */
    .flex-1 {
    -webkit-box-ordinal-group: 1; /* OLD - iOS 6-, Safari 3.1-6 */
    -moz-box-ordinal-group: 1; /* OLD - Firefox 19- */
    -ms-flex-order: 1; /* TWEENER - IE 10 */
    -webkit-order: 1; /* NEW - Chrome */
    order: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */
    }
    /* 子元素-显示在从左向右(从上向下)第2个位置,用于改变源文档顺序显示 */
    .flex-2 {
    -webkit-box-ordinal-group: 2; /* OLD - iOS 6-, Safari 3.1-6 */
    -moz-box-ordinal-group: 2; /* OLD - Firefox 19- */
    -ms-flex-order: 2; /* TWEENER - IE 10 */
    -webkit-order: 2; /* NEW - Chrome */
    order: 2; /* NEW, Spec - Opera 12.1, Firefox 20+ */
    }

     

    为了更好的兼容性,我们需要给容器声明flex-h/flex-v,而不是一般的flex:

    按 Ctrl+C 复制代码

    /* 父元素-flex容器 */
    .flex {
    display: box; /* OLD - Android 4.4- */
    display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
    display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
    display: -ms-flexbox; /* TWEENER - IE 10 */
    display: -webkit-flex; /* NEW - Chrome */
    display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
    }

     

    注意 :从测试结果可以发现flex布局会把伪元素当作元素来分配空间(文档好像有提到给伪元素设置position: fixed/absolute;可以避免这一情况,本文暂未验证),但我们一般希望伪元素只有装饰作用,不影响布局,这与我们的预期不一致。所以, 当flex布局中有伪元素时要特别小心,尽可能多地进行浏览器兼容性测试,或者改用float布局

    转自:http://www.tuicool.com/articles/Afq6Bzq

    http://www.cnblogs.com/mk2016/p/5562994.html

     

    再说下ios8绑定onclick事件点击之后没有反应:

     

     

     

     

    页面是span内部加的图标 然后绑定click事件,新人的常规想法,但是``` 不和正常的语义。

    为什么要在span上绑事件呢,用button、a不是更符合语义吗?

    后期注意:

    在移动端ios的span div元素不能使用click事件,android的只有div不能绑定click事件,最好用原生的ontouch事件,但是对其他的事件比如focus什么的还是可以用的,其他元素绑定click也没问题,但是建议在移动端用touch事件取代click事件比较好。 

     

    不为方法的方法。

    解决的办法:给span 这个按钮加个样式{cursor:pointer;};

    span 添加 cursor:pointer 这样的属性以告诉内核这元素是按钮,至于原因,没别的,就是内核的 bug。

     

    转载于:https://www.cnblogs.com/vince-cup/p/5983745.html

    展开全文
  • 今天在做真机调试的时候,遇到下面的一个问题: Could not locate device support files. This iPhone 6s is running iOS 11.1 (15B93)...上面的意思是,在调试前我将我手机的iOS系统 升级到了最新版11.1版本,而我的

    今天在做真机调试的时候,遇到下面的一个问题:
    这里写图片描述

    Could not locate device support files. 
    This iPhone 6s is running iOS 11.1 (15B93), which may not be supported by this version of Xcode.
    

    上面的意思是,在调试前我将我手机的iOS系统 升级到了最新版11.1版本,而我的Xcode9支持的最高版本是11.0的。这也不奇怪,手机肯定都是先推送的,这是苹果一贯的做法。那么遇到上面的问题我们怎么解决呢?

    解决办法

    1、复制一份旧的SDK,并重新命名为真机测试需要的SDK版本;
    具体做法是,找到路径: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk (提示:要在应用程序中找到Xcode,右键点击 -> 显示包内容,以前Xcode版本的iOS SDK有的保存在系统根目录下)。

    复制一份iPhoneOS.sdk,并命名为iPhoneOS11.1.sdk。如下图所示:
    这里写图片描述

    2,新增真机调试包及内容
    打开路径:
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 。我在CocoaChina上找到了11.1的真机包,链接地址如下:
    http://www.cocoachina.com/bbs/read.php?tid=1726904。然后我们打开DeviceSupport并复制一份。
    这里写图片描述
    具体做法是,创建一个新的真机需要的版本11.1(15B93),然后将从 cocoachina下载的文件拷贝到这个地方即可。

    3、修改SDKSettings.plist文件中的版本号

    按照/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk 的顺序打开SDKSettings.plist 文件,将里面所有跟版本有关的数字都修改为11.1即可。再次运行就好了。
    这里写图片描述

    展开全文
  • (1)安装与运行 在网上搜索微信的历史版本,下载一个兼容多开的版本(实际上是bundleID...小程很自然地猜测,客户端有一个逻辑,是把当前的版本号与服务器返回的版本号作对比,如果发现当前的版本号过,就提示升级

    (1)安装与运行

    在网上搜索微信的历史版本,下载一个兼容多开的版本(实际上是bundleID不一样),比如5.0版本。当然也可以通charles等,在AppStore上下载微信旧版本,再重签名。

    通过pp助手之类的工具,把旧版本微信安装到手机。

    启动微信,登陆账号,遇到这样的提示:
    在这里插入图片描述

    OS逆向开发,突破微信强制升级机制,让低版本也能正常

    使用版本过低,无法使用。

    问题出现了,那怎么解决呢?

    小程很自然地猜测,客户端有一个逻辑,是把当前的版本号与服务器返回的版本号作对比,如果发现当前的版本号过低,就提示升级。那么,当前的版本号是怎么获取到的呢,它是不是从一个函数返回的呢?如果小程把这个值改掉会怎么样呢?

    (2)突破限制

    同样,先要通过classdump拿到微信的所有类的声明。

    然后搜索"version"关键字,对可能是返回版本值的函数进行注入,观察各个地方的输出。

    注入的办法,用小程上一篇介绍的iOSOpenDev来做即可,而观察输出则使用之前介绍的socat。

    这里给出部分注入的代码的截图:
    在这里插入图片描述
    iOS逆向开发,突破微信强制升级机制,让低版本也能正常使用
    最终可以确认,CUtility::GetVersion就是目标函数,通过一个公共类来返回版本值,这在设计上是很合理的事情了。

    运行微信时,可以在系统日志中看到这样的输出:

    Oct 18 15:14:46 yeah MicroMessenger[2506] : -------CUtility::GetVersion in

    Oct 18 15:14:46 yeah MicroMessenger[2506] : -------CUtility::GetVersion out, ret=352321792

    Oct 18 15:14:46 yeah MicroMessenger[2506] : ------->MicroMessengerAppDelegate::didFinishLaunchingWithOptions in

    其中,352321792就是当前的版本值。

    对CUtility::GetVersion这个函数的返回值作修改,尝试返回452321792(这个值是简单地把最高位加1而来):在这里插入图片描述

    iOS逆向开发,突破微信强制升级机制,让低版本也能正常使用
    再次运行微信,低版本的限制消失了,看到这样的界面:
    在这里插入图片描述
    iOS逆向开发,突破微信强制升级机制,让低版本也能正常使用
    身份验证之后,进入到陈旧的5.0界面:
    在这里插入图片描述
    在这里插入图片描述
    bundleID是一个APP的唯一标识,比如微信6.x版本的bundleID是这样的:
    在这里插入图片描述
    因为微信6.x的bundleID与5.0版本的不一样,这就意味着,同时安装5.0版本与6.x版本的微信是可行的,比如小程就安装了两个(微信多开),运行起来的效果是这样的(录制时的帧率有点低,实际上是两个APP在切换):在这里插入图片描述

    展开全文
  • 如题,首先从51degrees.mobi的codeplex下载1.2.0.5版本的库。...2版本的库已经能获取硬件型号了,只有付费版的才行。 当我们下回1.2.0.5版本的库时,里面的WURFL硬件包是旧版的,我们可以去WURFL的官方网站下...
  • 每次打开APP都提示需要升级,但是点了升级又升级不了,好糟心啊。我本身是APP开发者,研究了一下(百度了一下,具体那篇文章记不得了),发现可以用电脑给手机安装软件。 用电脑给老手机安装软件 尝试使用华为...
  • xcode 7.3问题汇总 import Class 提示 ...自定义枚举提示 ...想使用xcode7.3了 然后手机升级到了iOS9.3 ,这时xcode 7.2无法使用手机进行真机测试 解决办法 /Applications/Xcode.app/Contents/
  • androidx是goggle对support包进行了整合的一个库,用来替代support,而google也会逐步放弃对support库的升级和维护,所以我们项目再不久前就进行了迁移。       &nb...
  • 最近遇到开发的某域名升级为https后手机qq浏览器、魅族自带浏览器等低版本chrome内核浏览器访问不了,在SSL诊断工具:https://www.ssllabs.com/ssltest/analyze.html 中诊断网站发现对比了一下该网站和另一网站的...
  • 1、HBuilderX版本很老,或cli编译器一直没升级,而云打包服务器已经升级,此时编译环境版本低,而运行环境版本高,就会报错。 2、使用老版HBuilderX打包了App后,后来使用新版HBuilderX或新版cli制作了wgt升级包。...
  • d7之后,对升级影响比较大的版本有这些:delphi2009,xe2以及xe5。2009开始string默认为unicode,xe2引入firemonkey,xe5支持手机开发。 高版本的其它一些新特性,比如泛型,闭包,增强的rtti,dbexpress,...
  • Android项目的打包签名及应用的版本升级...是因为在android手机上已经安装过一个低版本的应用,安装高版本应用时,旧版应用的签名与新版应用的签名信息一致才导致出现此错误。 解决方法: 1.把旧的版本卸载掉
  • 但时不时都会有人偷懒,或者使用手机OTA升级而没有对系统备份,最终导致满意新系统了,想降级却无备份可以恢复的尴尬局面。面对这种情况,小编也是百般无奈啊...好吧,既然有那么多小伙伴束手无策,那小编今天就有...
  • qq2012不升级

    2014-03-28 12:04:10
    QQ2012不升级版本,无广告不升级,在运存低手机上可以后台退出,相对于新版本少了支付宝或者拉手网一类的不必要的附加程序
  • 三星手机是韩国企业集团的,这是很多人都知道的,其实三星集团真... 这不,三星现在又要将C系列的手机升级到Android 7.0系统,这样一看感觉挺好的,毕竟现在有很多东西低版本的Android 根本用不了,C系列将要升级的手
  • 手机升级系统如何找回丢失的文件

    千次阅读 2014-03-07 13:40:18
    我的智能手机当时买的时候只看着降价打折了 ,没看清配置,用了一段时间发现好多app能用,才发现原来是系统版本低,翻出说明书一看,还好机子支持系统升级,还而已再往上面升级3个版本,虽然不是最新的,但也是...
  • 在开发中,肯定还要使用Xcode9.4打包上架测试,悲剧的是我们手机系统已经升级了。 而Xcode9.4并能支持iOS12系统的真机测试,这里为大家详细介绍解决方法,分以下几个步骤: 1.先下载iOS12的真机调试包,这个一般...
  • 如果不是以+E.164格式出现的用户将不会在低版本客户端显示。但Lync2013将自动识别普通格式。解决方法1:手动将AD用户的电话号码更改为+E.164格式比如 +5502然后更新地址簿:确认一下结果,已经可以显示了:解决方法....
  • 版本特性

    2019-07-03 18:23:00
     Android软件适配一直是开发人员棘手的问题,除了应对各手机厂商深度定制的系统和各种尺寸的硬件设备外,Android本身版本升级所带来的兼容问题也是不得考虑的问题,否则在低版本上调用了高版本API就会出问题。...
  • 我的596升级到Windows Mobile 6了

    千次阅读 2007-08-29 22:50:00
    经过一周的努力,刷了5次ROM,终于把我的 O2 Xda (596) Smartphone 手机升级到 Windows Mobile 6,使用一切正常下面是手机截图: 刷机后主要遇到的问题是...具体方法可以参考解决因gsm版本而造成刷wm6出现能上网

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 199
精华内容 79
关键字:

手机版本低升级不了