HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

ThinkPHP5.0入门到精通(含项目)

ThinkPHP5.0入门到精通
http://study.163.com/course/courseMain.htm?courseId=1003838084
课程介绍:
第一部分:
Thinkphp5.0入门教程,使开发者快速从thinkphp3.2版本过度到thinkphp5.0,最高效的降低学习成本,不研究概念性的东西,只讲究实际开发中用到的东西。
第二部分:
属于高级教程,有一定的难度,开发项目中常用的到类库或则组件,都会陆续更新上去,比如phpmailer邮件服务,阿里云oss存储服务,
支付宝支付,微信支付,七牛云存错,图片上传等等,整理成插件的形式,便于学习和使用。
由于课程标题数量限制,只能突出一部分知识点。

有php的基础知识,有了解过thinkphp方面的知识。

第一阶段(学前私信:835173372)
001:站点部署环境和框架解释
002:代码执行流程和命名空间
003:数据库配置和引入db类库

004:数据库CURD-查询数据,插入数据
单条查询,批量查询,单条插入,批量插入。

005:数据库CURD-更新数据,删除数据
单条更新,批量更新,单条删除,批量删除,字段加1/n,字段健1/n

006:数据库CURD-查询方法,查询语法
getTableInfo()方法,where()F方法,whereOr()方法,混合查询,LIKE查询, BETWEEN查询等等

007:数据库CURD-多表联查,缓存查询
alias(),join(),limit(),group(),order(),cache(),select()使用技巧。

008:数据库CURD-分页查询,聚合查询
page(),limit(),count(),max(),min(),avg()使用技巧

009:数据请求-请求信息,请求接受变量
Request类的引入和使用,is_Get();is_Post();is_Ajax();is_Mobile();input()助手函数的使用技巧

010:数据请求-伪静态,公共方法创建等
数据请求-伪静态,HTTP头信息,公共方法引入等

011:控制器初始化-空操作-跳转重定向等
控制器定义,初始化,空操作,跳转重定向详解

012:视图,模板赋值渲染,循环遍历等等
模板引擎,模板赋值,模板渲染,模板定位,模板标签,变量输出,循环输出标签,比较标签,原生php,定义标签。

013:Tp5.0-session功能的封装和执行原理
Session的创建,获取,删除,助手函数的使用。

014:分页实现-内置Paginator对象详解等
分页实现(内置Paginator对象来实现)

015:Workerman-PHP socket服务器框架
修改站点入口地址和Workerman-PHP socket服务器框架

插件开发
016:搭建PHPMailer类库开发邮件发送
git地址:https://github.com/PHPMailer/PHPMailer
php.ini注意开启ssl服务,命名空间的注意事项,smtp授权码的概念,网易邮箱客户端端口465

017:Tp5.0验证码的创建和验证使用技巧
验证码类库(think-captcha)引入使用,一个页面创建个多个验证吗,多个验证码的验证等等

018:验证码的ajax动态切换效果开发案例
cdn模式引入jquery类库,标准的ajax请求api接口数据案例,http请求和响应分析。

019:命令行自动生成模块目录和控制器
命令行自动生成模块目录和控制器
ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build类库

020:Composer工具安装和使用-安装Tp5和插件
1:Composer工具安装和使用。2:使用中国镜像设置。3:安装thinkphp最新包和扩展类库。

项目实战-PHP订单系统开发

021:项目需求分析和库表结构分析
商品主表和附表分析,订单主表和附表分析,页面开发所用到js库-vue.js,layer-mobile.js,jqurey.js

022:下单页面模板引入,vue对象赋值技巧
以json字符串的格式赋值到模板的vue对象里

023:vue实现页面的数据绑定(需要vue的知识)
vue的高级用法,包括click事件,watch,v-model用法等等。

024:vue配合后台接口ajax实现省市区三级联动插件
后台提供ajax接口数据,用户不同的操作响应不同的返回数据。

025:vue配合Layer-mobil组合表单数据,下单操作
vue配合Layer-mobil组合表单数据,下单操作,layer-mobile做一些提示效果

026:订单入库操作,库表的回滚操作
订单入库操作,库表的回滚操作-多表更新操作容易产生垃圾数据。

027:代码优化和项目终结
代码优化和项目终结

学习地址:
http://study.163.com/course/courseMain.htm?courseId=1003838084

继续阅读 »

ThinkPHP5.0入门到精通
http://study.163.com/course/courseMain.htm?courseId=1003838084
课程介绍:
第一部分:
Thinkphp5.0入门教程,使开发者快速从thinkphp3.2版本过度到thinkphp5.0,最高效的降低学习成本,不研究概念性的东西,只讲究实际开发中用到的东西。
第二部分:
属于高级教程,有一定的难度,开发项目中常用的到类库或则组件,都会陆续更新上去,比如phpmailer邮件服务,阿里云oss存储服务,
支付宝支付,微信支付,七牛云存错,图片上传等等,整理成插件的形式,便于学习和使用。
由于课程标题数量限制,只能突出一部分知识点。

有php的基础知识,有了解过thinkphp方面的知识。

第一阶段(学前私信:835173372)
001:站点部署环境和框架解释
002:代码执行流程和命名空间
003:数据库配置和引入db类库

004:数据库CURD-查询数据,插入数据
单条查询,批量查询,单条插入,批量插入。

005:数据库CURD-更新数据,删除数据
单条更新,批量更新,单条删除,批量删除,字段加1/n,字段健1/n

006:数据库CURD-查询方法,查询语法
getTableInfo()方法,where()F方法,whereOr()方法,混合查询,LIKE查询, BETWEEN查询等等

007:数据库CURD-多表联查,缓存查询
alias(),join(),limit(),group(),order(),cache(),select()使用技巧。

008:数据库CURD-分页查询,聚合查询
page(),limit(),count(),max(),min(),avg()使用技巧

009:数据请求-请求信息,请求接受变量
Request类的引入和使用,is_Get();is_Post();is_Ajax();is_Mobile();input()助手函数的使用技巧

010:数据请求-伪静态,公共方法创建等
数据请求-伪静态,HTTP头信息,公共方法引入等

011:控制器初始化-空操作-跳转重定向等
控制器定义,初始化,空操作,跳转重定向详解

012:视图,模板赋值渲染,循环遍历等等
模板引擎,模板赋值,模板渲染,模板定位,模板标签,变量输出,循环输出标签,比较标签,原生php,定义标签。

013:Tp5.0-session功能的封装和执行原理
Session的创建,获取,删除,助手函数的使用。

014:分页实现-内置Paginator对象详解等
分页实现(内置Paginator对象来实现)

015:Workerman-PHP socket服务器框架
修改站点入口地址和Workerman-PHP socket服务器框架

插件开发
016:搭建PHPMailer类库开发邮件发送
git地址:https://github.com/PHPMailer/PHPMailer
php.ini注意开启ssl服务,命名空间的注意事项,smtp授权码的概念,网易邮箱客户端端口465

017:Tp5.0验证码的创建和验证使用技巧
验证码类库(think-captcha)引入使用,一个页面创建个多个验证吗,多个验证码的验证等等

018:验证码的ajax动态切换效果开发案例
cdn模式引入jquery类库,标准的ajax请求api接口数据案例,http请求和响应分析。

019:命令行自动生成模块目录和控制器
命令行自动生成模块目录和控制器
ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build类库

020:Composer工具安装和使用-安装Tp5和插件
1:Composer工具安装和使用。2:使用中国镜像设置。3:安装thinkphp最新包和扩展类库。

项目实战-PHP订单系统开发

021:项目需求分析和库表结构分析
商品主表和附表分析,订单主表和附表分析,页面开发所用到js库-vue.js,layer-mobile.js,jqurey.js

022:下单页面模板引入,vue对象赋值技巧
以json字符串的格式赋值到模板的vue对象里

023:vue实现页面的数据绑定(需要vue的知识)
vue的高级用法,包括click事件,watch,v-model用法等等。

024:vue配合后台接口ajax实现省市区三级联动插件
后台提供ajax接口数据,用户不同的操作响应不同的返回数据。

025:vue配合Layer-mobil组合表单数据,下单操作
vue配合Layer-mobil组合表单数据,下单操作,layer-mobile做一些提示效果

026:订单入库操作,库表的回滚操作
订单入库操作,库表的回滚操作-多表更新操作容易产生垃圾数据。

027:代码优化和项目终结
代码优化和项目终结

学习地址:
http://study.163.com/course/courseMain.htm?courseId=1003838084

收起阅读 »

mui扩展图标的使用

1.在html中引入icons-extra.css文件即可。此文件可以在例子的css文件中找到,引入即可使用mui扩展图标

  1. 参考mui如何增加自定义icon图标

1.在html中引入icons-extra.css文件即可。此文件可以在例子的css文件中找到,引入即可使用mui扩展图标

  1. 参考mui如何增加自定义icon图标

video视频,点击播放禁止自动全屏,点击全屏自动横屏播放

点击播放禁止自动全屏

首先在manifest.json的plus节点下新增allowsInlineMediaPlayback节点为true。

"plus":{  
    "allowsInlineMediaPlayback": true  
}

然后在video标签中添加playsinline属性,然后测试得出iphone5s系统8.3上还是会自动全屏(其他的没有全部测试过,不太清楚),查了一圈后加上webkit-playsinline好了,
注意两个都加上,否则高低版本不兼容

<video controls="controls" preload="auto" playsinline webkit-playsinline src="" poster=""  width="100%" height="auto">  
</video>

点击全屏自动横屏播放

现在已经可以点击不全屏播放了,但是看着字幕太小看不清,想点开全屏看,发现不能横屏,还是很小看不清,才发现app被设置成了禁止横屏,这就尴尬了!经过一番查找还是被我找出在app禁止横屏的基础上,点击全屏横屏播放的解决办法了:
首先在manifest.json里设置

全部勾上,或者直接在manifest.json的plus节点下的distribute节点里添加:

"orientation": ["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/

然后在首页

plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏

所以app还是禁止横屏的

然后iOS上监听video元素的webkitbeginfullscreen与webkitendfullscreen事件,在全屏开始和结束时,对屏幕方向做相应的调整:

// iOS平台的视频全屏旋转  
var fullScreenOfIos = function(videoElem) {  
    // 监听的事件与Android平台有很大区别  
    videoElem.addEventListener('webkitbeginfullscreen', function() {  
        plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏  
    });  
    videoElem.addEventListener('webkitendfullscreen', function() {  
        plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏  
    });  
};

Android上监听webkitfullscreenchange事件,并且读取全屏元素,对屏幕方向做出调整:

// Android平台的视频全屏旋转  
var fullScreenOfAndroid = function() {  
         if(true) {  
        // 最新5+API的支持  
        var self = plus.webview.currentWebview();  
        self.setStyle({  
            videoFullscreen: 'landscape'  
        });  
    } else {  
                 document.addEventListener('webkitfullscreenchange', function() {  
                    var el = document.webkitFullscreenElement; //获取全屏元素  
                    if(el) {  
                        plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏  
                    } else {  
                        plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏  
                    }  
                });  
        }  
};

最后让我们来分别调用一下:

// 涉及到5+API的内容,均在plusready事件后调用;  
document.addEventListener('plusready', function() {  
    var osName = plus.os.name;  
    if(osName === 'Android') {  
        fullScreenOfAndroid();  
    } else if(osName === 'iOS') {  
        var videoElem = document.getElementById('video');  
        fullScreenOfIos(videoElem);  
    }  
});

大功告成!!!

继续阅读 »

点击播放禁止自动全屏

首先在manifest.json的plus节点下新增allowsInlineMediaPlayback节点为true。

"plus":{  
    "allowsInlineMediaPlayback": true  
}

然后在video标签中添加playsinline属性,然后测试得出iphone5s系统8.3上还是会自动全屏(其他的没有全部测试过,不太清楚),查了一圈后加上webkit-playsinline好了,
注意两个都加上,否则高低版本不兼容

<video controls="controls" preload="auto" playsinline webkit-playsinline src="" poster=""  width="100%" height="auto">  
</video>

点击全屏自动横屏播放

现在已经可以点击不全屏播放了,但是看着字幕太小看不清,想点开全屏看,发现不能横屏,还是很小看不清,才发现app被设置成了禁止横屏,这就尴尬了!经过一番查找还是被我找出在app禁止横屏的基础上,点击全屏横屏播放的解决办法了:
首先在manifest.json里设置

全部勾上,或者直接在manifest.json的plus节点下的distribute节点里添加:

"orientation": ["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/

然后在首页

plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏

所以app还是禁止横屏的

然后iOS上监听video元素的webkitbeginfullscreen与webkitendfullscreen事件,在全屏开始和结束时,对屏幕方向做相应的调整:

// iOS平台的视频全屏旋转  
var fullScreenOfIos = function(videoElem) {  
    // 监听的事件与Android平台有很大区别  
    videoElem.addEventListener('webkitbeginfullscreen', function() {  
        plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏  
    });  
    videoElem.addEventListener('webkitendfullscreen', function() {  
        plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏  
    });  
};

Android上监听webkitfullscreenchange事件,并且读取全屏元素,对屏幕方向做出调整:

// Android平台的视频全屏旋转  
var fullScreenOfAndroid = function() {  
         if(true) {  
        // 最新5+API的支持  
        var self = plus.webview.currentWebview();  
        self.setStyle({  
            videoFullscreen: 'landscape'  
        });  
    } else {  
                 document.addEventListener('webkitfullscreenchange', function() {  
                    var el = document.webkitFullscreenElement; //获取全屏元素  
                    if(el) {  
                        plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏  
                    } else {  
                        plus.screen.lockOrientation('portrait-primary'); //锁死屏幕方向为竖屏  
                    }  
                });  
        }  
};

最后让我们来分别调用一下:

// 涉及到5+API的内容,均在plusready事件后调用;  
document.addEventListener('plusready', function() {  
    var osName = plus.os.name;  
    if(osName === 'Android') {  
        fullScreenOfAndroid();  
    } else if(osName === 'iOS') {  
        var videoElem = document.getElementById('video');  
        fullScreenOfIos(videoElem);  
    }  
});

大功告成!!!

收起阅读 »

关于setPullToRefresh 背景色

webview 的 setPullToRefresh 拉下来时的背景色怎么设置啊?

webview 的 setPullToRefresh 拉下来时的背景色怎么设置啊?

h5+免费教程、mui免费教程、各类app开发实战教程更新中,一起努力共同进步!!

mui

hcoder 一直致力于奉献高质量的视频教程,官网上 mui、h5 等免费教程播放量已经达到5万。
教程汇总
知识点 : JavaScript 快速提高视频教程
实战: MUI、H5 APP 实战教程 - 仿《有道词典》
知识点 : HBuilder 8.0.1 APP开发 - 新功能全接触
知识点 : APP开发教程 - 启动动画
知识点 : APP开发实例教程 - 窗口切换
知识点 : 移动端图片剪裁、上传视频教程
知识点 : app开发教程-用户注册、登录
实战 : APP开发实战 - 新闻客户端
知识点 : HTML 5 开发教程
知识点 : mui 全套教程

免费教程地址
http://www.hcoder.net/course/index/cate/4

继续阅读 »

hcoder 一直致力于奉献高质量的视频教程,官网上 mui、h5 等免费教程播放量已经达到5万。
教程汇总
知识点 : JavaScript 快速提高视频教程
实战: MUI、H5 APP 实战教程 - 仿《有道词典》
知识点 : HBuilder 8.0.1 APP开发 - 新功能全接触
知识点 : APP开发教程 - 启动动画
知识点 : APP开发实例教程 - 窗口切换
知识点 : 移动端图片剪裁、上传视频教程
知识点 : app开发教程-用户注册、登录
实战 : APP开发实战 - 新闻客户端
知识点 : HTML 5 开发教程
知识点 : mui 全套教程

免费教程地址
http://www.hcoder.net/course/index/cate/4

收起阅读 »

写给HBuilder的警示

HBuilder,是我用过最好用的一个工具,我也期盼与逐步这个工具成长。
但无意中我看到了APICloud及被法院判决抄袭违法事宜,惊叹中国知识产权违法成本太低了!

然后,我即被他的官网征服了!
这个流氓平台无疑对产品运维的很用心和细致,无论是产品介绍或是学习资料,都一目了然,
丰富且全面。记得学习HBuilder时,在其官网很难找到系统的学习资料,页面看上去繁杂和平庸。在网上搜索的视频,绝大多数还收费。

尽管我对HBuilder抱有敬畏,但我依然担心,有朝一日会被对手超越。至少,目前从网上搜索,该平台能搜索到时50万 条信息,而HBuilder才20万+ 。

在经济市场上,技术实力雄厚固然是根本,但不懂得市场运营也会惨败。例如,运作不成功的Huilder技术人才,也有可能被对手以高手挖墙角,并携带核心源码投入敌营。中国产权违法成本之低,根本不需要冒太大风险。
总之太多的血的教训,我不需要多说。
在选择Hbuilder或Apicloud之间,我仍在犹豫。因为,作为一名开发者,投入的是最宝贵的时间成本。

继续阅读 »

HBuilder,是我用过最好用的一个工具,我也期盼与逐步这个工具成长。
但无意中我看到了APICloud及被法院判决抄袭违法事宜,惊叹中国知识产权违法成本太低了!

然后,我即被他的官网征服了!
这个流氓平台无疑对产品运维的很用心和细致,无论是产品介绍或是学习资料,都一目了然,
丰富且全面。记得学习HBuilder时,在其官网很难找到系统的学习资料,页面看上去繁杂和平庸。在网上搜索的视频,绝大多数还收费。

尽管我对HBuilder抱有敬畏,但我依然担心,有朝一日会被对手超越。至少,目前从网上搜索,该平台能搜索到时50万 条信息,而HBuilder才20万+ 。

在经济市场上,技术实力雄厚固然是根本,但不懂得市场运营也会惨败。例如,运作不成功的Huilder技术人才,也有可能被对手以高手挖墙角,并携带核心源码投入敌营。中国产权违法成本之低,根本不需要冒太大风险。
总之太多的血的教训,我不需要多说。
在选择Hbuilder或Apicloud之间,我仍在犹豫。因为,作为一名开发者,投入的是最宝贵的时间成本。

收起阅读 »

MUI入门笔记

mui hellomui

学习的是腾讯课程的教程h5+ App 开发实战教程 - 仿《有道词典》

一.准备工作

  1. 新建项目,选择mui作为模板
  2. 规划代码,建立基础文件作为模板来建立新文件copy.html
  3. 引css时引mui.css,而不是压缩版,方便做全局修改

二.常用代码记录
点击a标签打开新页面

<a id=“此处id要与html名字一致” onclick="openInfo(this.id)">  

<script>  
    function openInfo(id) {  
        mui.openWindow({  
            url: id + '.html',  
            id: id + '.html',  
        });  
    }  
</script>

二级页面标题栏,带返回键

<header class="mui-bar mui-bar-nav">  
    <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
    <h1 class="mui-title" id="title">标题</h1>  
</header>
继续阅读 »

学习的是腾讯课程的教程h5+ App 开发实战教程 - 仿《有道词典》

一.准备工作

  1. 新建项目,选择mui作为模板
  2. 规划代码,建立基础文件作为模板来建立新文件copy.html
  3. 引css时引mui.css,而不是压缩版,方便做全局修改

二.常用代码记录
点击a标签打开新页面

<a id=“此处id要与html名字一致” onclick="openInfo(this.id)">  

<script>  
    function openInfo(id) {  
        mui.openWindow({  
            url: id + '.html',  
            id: id + '.html',  
        });  
    }  
</script>

二级页面标题栏,带返回键

<header class="mui-bar mui-bar-nav">  
    <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
    <h1 class="mui-title" id="title">标题</h1>  
</header>
收起阅读 »

【解决方案】关于console.log在HBuilder控制台不输出日志的问题解决办法

解决方案 模拟器 真机运行 控制台调试 HBuilder

解决办法分2种情况:

  1. 如果是使用夜神模拟器,可参考http://ask.dcloud.net.cn/article/1297这篇文章进行解决。
  2. 如果是使用手机进行调试:
    2.1 重新开启USB调试模式,或者重启手机后重试;
    2.2 确认你的手机日志级别,以360奇酷手机青春版为例, 在拨号界面输入
    20121220# (华为为 *#*#2846579#*#\ )进入工程模式(其他手机型号进入工程模式输入的指令会不一样):

选择日志输出等级,进入日志等级控制界面:

确定Log print enable 为 Enable,如果不是,设置为enable
确定Java log level 为 LOGV,如果不是,设置为LOGV
设置完后,再刷新下页面,应该就有日志输入了。

继续阅读 »

解决办法分2种情况:

  1. 如果是使用夜神模拟器,可参考http://ask.dcloud.net.cn/article/1297这篇文章进行解决。
  2. 如果是使用手机进行调试:
    2.1 重新开启USB调试模式,或者重启手机后重试;
    2.2 确认你的手机日志级别,以360奇酷手机青春版为例, 在拨号界面输入
    20121220# (华为为 *#*#2846579#*#\ )进入工程模式(其他手机型号进入工程模式输入的指令会不一样):

选择日志输出等级,进入日志等级控制界面:

确定Log print enable 为 Enable,如果不是,设置为enable
确定Java log level 为 LOGV,如果不是,设置为LOGV
设置完后,再刷新下页面,应该就有日志输入了。

收起阅读 »

浅谈hbuilder开发app后的优化 - (2)多webview?多div?选啥呢!

div Webview 性能

浅谈hbuilder开发app后的优化 - (1)加速启动,优化体验
前言:
回顾以下,上一次我们了解了如何加速启动,制作一个"秒开"的假象,本着循序渐进的原则,这一次我将讲述一下进入主页面(以下用main代替)之后,我们该如何优化,本次内容比较枯燥,涉及比较多的理论部分,深入理解之后有利于main的优化,而main的优化往往是留住用户的重点,因为用户进入app后的第一次操作体验往往影响着用户的留存率。

(2)多webview?多div?选啥呢!
首先我们看看dcloud官方的建议:
使用View绘制标题栏,再用一个子webview作为main显示,需要底部tab再用一个webview作为底部栏监听操作事件即可。
从这一句话听起来似乎很正常,没有任何问题,是的,在一个简单的main来说,这样没任何问题,但是如果应用在多webview就出现问题了。
我们思考下,一般app都是<标题><内容区><底部>,这意味着如果采用dcloud官方建议的这种办法来说,在启动时候就创建了两个webview实例,而普遍的app均有3~4个选项卡,这意味着启动app的时候就创建了至少4~5个webview实例,对于性能中档以上的手机并没有压力,但是实际上依然会碰到很多手机性能低的用户,这时候我们就要好好考虑,多webview还是多div呢?

多webview?会遇到那些"坑"呢?
//> 1:OOM (Out Of Memory)
在webview中显示的图片过多,做webview切换动画的时候往往会遇到卡顿,动画不流畅,甚至切换后台重新切换回来后app就黑屏,然后呢?... 这不就挂了么?
设想一个场景,你开着app,点来点去,看到感兴趣的,不错,准备点收藏,结果有人发条微信,你点开一看,然后返回,app奔溃,oh shit!
这是一个真实的实例,我曾经接到一个app,做一个类似应用商店的产品,如果用多webview可以比较好的优化列表滚动流畅度,但是很多子页,再简单的使用了多webview之后,oom!结果app奔溃了,那么oom的话,到底是怎么引起的呢?
首先,图片加载过多,大图过多,页面dom树过度复杂均有可能,第二就是js部分,过多for,if嵌套,自调用,变量使用后没有释放(即便JS本身有着gc机制,但是js语法是十分灵活的,我们不能全部都丢给解释器去处理判断,尽量自己处理下,我相信win下使用C开发过应用程序的都有所体验吧)
【解决方法】OOM,自己多注意,这是码代码的时候就需要思考的。
//>2:动画卡顿,画面闪动
在没有OOM的情况下也会出现动画卡顿问题,一般情况下为页面太复杂,导致进行动画的时候不流畅,或者是一个页面隐藏后显示,页面会闪一下,甚至白屏。
【解决方法】动画卡顿可以采用View预先drawBitmap,然后先飘图再显示,页面显示不全大多数是因为硬件加速,一个隐藏部分忽然显示导致的,一般情况下可以采用这样:当前页面fade-out 目标页面zoom-fade-in,这部分不需要使用View绘制也可以达到流畅。因为默认情况下隐藏后我们的渲染引擎会暂停渲染页面,这就可以释放部分内存用于显示页面。
//>3:窗体错误
这个很奇特的,一个多webview的页面,分为父子webview,当其中一个子webview打开的子页面请求全屏后,重新返回会出现子webview错误,检测后发现webview居然已经不是main的子webview了。
【解决方法】无力相助

综合上面所说多webview大多情况下都是卡,占用内存。所以有些人就说那就全部用多div呗

多div?会遇到那些"坑"呢?
//> 1:进入main时卡顿
多div因为均存在一个子页面,webview开始加载的时候就会"同步"加载所有div,因此一个webview如果出现多div且各div的dom树均复杂的情况下,会出现进入main的时候一开始比较卡顿,之后才能正常操作
【解决方法】使用vue进行动态页面处理,vue本身会自带虚拟DOM,不论是复用div,页面动态增加删除div,vue的表示均比较良好,加一个plus.nativeUI.showWaiting 雪花滚动然用户觉得还在加载(要是内容实在很多就不要滚动了,滚久了你的app也可以滚了),等待vue渲染完成事件响应之后再关闭雪花滚动
//>2.安卓低版本div无法滚动,IOS透传
众所周知安卓低版本无法进行div滚动,而IOS的div会出现透传问题。
【解决方法】改用mui本身带来的区域滚动组件(iscroll),结合Vue的话需要在渲染完成后重新初始化iscroll
//>3 安卓div区域滚动不流畅,太卡
div滚动本身就不如原生滚动流畅,这个无话可说
【解决方法】对应webview启动硬件加速,并且渲染模式改为allways(总是渲染,会消耗比较多的内存),尽量减少页面的图片量,以及图片大小,因为硬件层在同步绘制图片时候也会消耗比较多的内存。
//>4动画不流畅
没什么好说,切换动画不流畅
【解决方法】同上

综合上面所说,多div大多情况下就是不流畅,不流畅,不流畅,重要的事情说三遍。

那么都是那么扯淡,我们应该如何选择呢?我的考虑是两者结合!
多div不流畅但是占用内存少,多webview卡,但是滚动方面流畅,我们可以把两者结合起来,做一个占用内存少,不卡的app。

首先: main采用多div是种明智的选择,一般app首页都会加上轮播组件(slider),那么多webview切换的时候其实会因为slider的问题导致卡顿,但是div切换不会,因此可以采用多div切换作为main,这样切换过程不会卡顿(注意控制好dom树结构)

其次: 部分少点击的页面采用webview方式打开,因为少点击所以意味着平时极少出现其来占用内存(类似设置,签到中心,积分中心,反馈),打开之后返回就关闭该webview实例,释放内存。

对于常用的页面,根据逻辑不同取舍,对于类似淘宝,京东商品详情页,朋友圈这类,应该采用webview方式打开,因为其加载图片过多,点击频率不高,可以达到流畅,并且占用内存比较少,用户执行返回之后清除页面图片以及数据,释放部分内存,且有利于下次重新载入此页面。
对于类似我的,消息列表,排行榜这类,应该采用div显示,因为其加载内容少,点击频率不高但是数据需要常驻内存,则直接采用div形式即可(什么? div不是没法滚动么,消息列表呢? 这个直接用ul+li就可以了,没有任何问题,在多个app上面使用过了)

上面这个就是大概的app一个大的考虑,至于细化到部分优化的,可以参考以下几点:

webview切换卡顿:
用view绘制目标webview,首先飘图,然后先隐藏当前webview,然后隐藏view,再显示目标webview,采用fade-in效果显示,这样有一个过度效果,用户体验比较好

webview动画pop-in卡顿
根据dcloud官方说明,pop-in和slide-in-right均有进行一个加速操作,但是pop-in是采用双窗口同时执行动画,而slide-in-right是单窗口,因此pop-in卡得时候,不妨尝试下slide-in-right

div切换卡顿
对于div切换卡顿其实本来就是这样,但是一般情况下我是采用css中的opacity控制显示与否,并且transtion控制动画效果,通过一个渐显渐隐的过程尽量减少用户的违和感(动画时间需要控制好)

沉浸式任务栏切换webview的时候因为窗口调整高度导致闪动
这个是我遇到一个网友问我的,对此我简单分析了下,传统的webview切换是这样的:

var wm = plus.webview.create("a.html","a");  
//监听wm loaded  
wm.show();

这样一个过程就意味是等wm加载完毕后就显示,但是这不意味着窗口高度调整好了!我们稍微修改下就可以完成这个处理

var wm = plus.webview.create("a.html","a");  
plus.nativeUI.showWaiting();

然后在a.html中这样处理

//监听当前wv loaded事件  
然后function里面写  
//>调整页面搞定代码  
plus.webview.show("a","fade-in",150,function(){  
    plus.navtiveUI.closeWaiting();  
})

其实iframe,div,webview均能作为tab 主要是切换里面一些细节做好处理就行了。
我相信很多人看起来一头雾水,然而懂的人自然明白如何操作,这仅仅是本人优化APP的一些方法,做出来分享而已,希望能给大家带来帮助。

继续阅读 »

浅谈hbuilder开发app后的优化 - (1)加速启动,优化体验
前言:
回顾以下,上一次我们了解了如何加速启动,制作一个"秒开"的假象,本着循序渐进的原则,这一次我将讲述一下进入主页面(以下用main代替)之后,我们该如何优化,本次内容比较枯燥,涉及比较多的理论部分,深入理解之后有利于main的优化,而main的优化往往是留住用户的重点,因为用户进入app后的第一次操作体验往往影响着用户的留存率。

(2)多webview?多div?选啥呢!
首先我们看看dcloud官方的建议:
使用View绘制标题栏,再用一个子webview作为main显示,需要底部tab再用一个webview作为底部栏监听操作事件即可。
从这一句话听起来似乎很正常,没有任何问题,是的,在一个简单的main来说,这样没任何问题,但是如果应用在多webview就出现问题了。
我们思考下,一般app都是<标题><内容区><底部>,这意味着如果采用dcloud官方建议的这种办法来说,在启动时候就创建了两个webview实例,而普遍的app均有3~4个选项卡,这意味着启动app的时候就创建了至少4~5个webview实例,对于性能中档以上的手机并没有压力,但是实际上依然会碰到很多手机性能低的用户,这时候我们就要好好考虑,多webview还是多div呢?

多webview?会遇到那些"坑"呢?
//> 1:OOM (Out Of Memory)
在webview中显示的图片过多,做webview切换动画的时候往往会遇到卡顿,动画不流畅,甚至切换后台重新切换回来后app就黑屏,然后呢?... 这不就挂了么?
设想一个场景,你开着app,点来点去,看到感兴趣的,不错,准备点收藏,结果有人发条微信,你点开一看,然后返回,app奔溃,oh shit!
这是一个真实的实例,我曾经接到一个app,做一个类似应用商店的产品,如果用多webview可以比较好的优化列表滚动流畅度,但是很多子页,再简单的使用了多webview之后,oom!结果app奔溃了,那么oom的话,到底是怎么引起的呢?
首先,图片加载过多,大图过多,页面dom树过度复杂均有可能,第二就是js部分,过多for,if嵌套,自调用,变量使用后没有释放(即便JS本身有着gc机制,但是js语法是十分灵活的,我们不能全部都丢给解释器去处理判断,尽量自己处理下,我相信win下使用C开发过应用程序的都有所体验吧)
【解决方法】OOM,自己多注意,这是码代码的时候就需要思考的。
//>2:动画卡顿,画面闪动
在没有OOM的情况下也会出现动画卡顿问题,一般情况下为页面太复杂,导致进行动画的时候不流畅,或者是一个页面隐藏后显示,页面会闪一下,甚至白屏。
【解决方法】动画卡顿可以采用View预先drawBitmap,然后先飘图再显示,页面显示不全大多数是因为硬件加速,一个隐藏部分忽然显示导致的,一般情况下可以采用这样:当前页面fade-out 目标页面zoom-fade-in,这部分不需要使用View绘制也可以达到流畅。因为默认情况下隐藏后我们的渲染引擎会暂停渲染页面,这就可以释放部分内存用于显示页面。
//>3:窗体错误
这个很奇特的,一个多webview的页面,分为父子webview,当其中一个子webview打开的子页面请求全屏后,重新返回会出现子webview错误,检测后发现webview居然已经不是main的子webview了。
【解决方法】无力相助

综合上面所说多webview大多情况下都是卡,占用内存。所以有些人就说那就全部用多div呗

多div?会遇到那些"坑"呢?
//> 1:进入main时卡顿
多div因为均存在一个子页面,webview开始加载的时候就会"同步"加载所有div,因此一个webview如果出现多div且各div的dom树均复杂的情况下,会出现进入main的时候一开始比较卡顿,之后才能正常操作
【解决方法】使用vue进行动态页面处理,vue本身会自带虚拟DOM,不论是复用div,页面动态增加删除div,vue的表示均比较良好,加一个plus.nativeUI.showWaiting 雪花滚动然用户觉得还在加载(要是内容实在很多就不要滚动了,滚久了你的app也可以滚了),等待vue渲染完成事件响应之后再关闭雪花滚动
//>2.安卓低版本div无法滚动,IOS透传
众所周知安卓低版本无法进行div滚动,而IOS的div会出现透传问题。
【解决方法】改用mui本身带来的区域滚动组件(iscroll),结合Vue的话需要在渲染完成后重新初始化iscroll
//>3 安卓div区域滚动不流畅,太卡
div滚动本身就不如原生滚动流畅,这个无话可说
【解决方法】对应webview启动硬件加速,并且渲染模式改为allways(总是渲染,会消耗比较多的内存),尽量减少页面的图片量,以及图片大小,因为硬件层在同步绘制图片时候也会消耗比较多的内存。
//>4动画不流畅
没什么好说,切换动画不流畅
【解决方法】同上

综合上面所说,多div大多情况下就是不流畅,不流畅,不流畅,重要的事情说三遍。

那么都是那么扯淡,我们应该如何选择呢?我的考虑是两者结合!
多div不流畅但是占用内存少,多webview卡,但是滚动方面流畅,我们可以把两者结合起来,做一个占用内存少,不卡的app。

首先: main采用多div是种明智的选择,一般app首页都会加上轮播组件(slider),那么多webview切换的时候其实会因为slider的问题导致卡顿,但是div切换不会,因此可以采用多div切换作为main,这样切换过程不会卡顿(注意控制好dom树结构)

其次: 部分少点击的页面采用webview方式打开,因为少点击所以意味着平时极少出现其来占用内存(类似设置,签到中心,积分中心,反馈),打开之后返回就关闭该webview实例,释放内存。

对于常用的页面,根据逻辑不同取舍,对于类似淘宝,京东商品详情页,朋友圈这类,应该采用webview方式打开,因为其加载图片过多,点击频率不高,可以达到流畅,并且占用内存比较少,用户执行返回之后清除页面图片以及数据,释放部分内存,且有利于下次重新载入此页面。
对于类似我的,消息列表,排行榜这类,应该采用div显示,因为其加载内容少,点击频率不高但是数据需要常驻内存,则直接采用div形式即可(什么? div不是没法滚动么,消息列表呢? 这个直接用ul+li就可以了,没有任何问题,在多个app上面使用过了)

上面这个就是大概的app一个大的考虑,至于细化到部分优化的,可以参考以下几点:

webview切换卡顿:
用view绘制目标webview,首先飘图,然后先隐藏当前webview,然后隐藏view,再显示目标webview,采用fade-in效果显示,这样有一个过度效果,用户体验比较好

webview动画pop-in卡顿
根据dcloud官方说明,pop-in和slide-in-right均有进行一个加速操作,但是pop-in是采用双窗口同时执行动画,而slide-in-right是单窗口,因此pop-in卡得时候,不妨尝试下slide-in-right

div切换卡顿
对于div切换卡顿其实本来就是这样,但是一般情况下我是采用css中的opacity控制显示与否,并且transtion控制动画效果,通过一个渐显渐隐的过程尽量减少用户的违和感(动画时间需要控制好)

沉浸式任务栏切换webview的时候因为窗口调整高度导致闪动
这个是我遇到一个网友问我的,对此我简单分析了下,传统的webview切换是这样的:

var wm = plus.webview.create("a.html","a");  
//监听wm loaded  
wm.show();

这样一个过程就意味是等wm加载完毕后就显示,但是这不意味着窗口高度调整好了!我们稍微修改下就可以完成这个处理

var wm = plus.webview.create("a.html","a");  
plus.nativeUI.showWaiting();

然后在a.html中这样处理

//监听当前wv loaded事件  
然后function里面写  
//>调整页面搞定代码  
plus.webview.show("a","fade-in",150,function(){  
    plus.navtiveUI.closeWaiting();  
})

其实iframe,div,webview均能作为tab 主要是切换里面一些细节做好处理就行了。
我相信很多人看起来一头雾水,然而懂的人自然明白如何操作,这仅仅是本人优化APP的一些方法,做出来分享而已,希望能给大家带来帮助。

收起阅读 »

APP应用安全问题个人理解,大神别喷我。

javascript
初次使用Hbuilder时候,简直惊呆了,开发速度简直像开火箭般,原生代码android+IOS需要一个月的工作量,在Hbuilder上一周不到就解决了,简直不敢相信。
东西是做出来了,可是问题来了,ipa或apk安装文件解压,我嚓,,啥代码都能看到,这是在玩我么。。。
在网上查了各种资料,加密,混淆,基本用处不大,于是我在想,我请求的参数,请求的地址都能隐藏不就好了么,,
但是还有一个问题,随便使用一个HTTP抓包工具都能看到所有的东西,又郁闷了。。。。
最后一招,在所有的请求参数弄一个加密,从客户端到服务器都是密文,服务器再解密不就OK了么,想到这里就没发现又漏洞了。

请求地址,参数加密都放在原生代码完成,js调用方法获取,原生代码中可存相应的秘钥机制与服务器端对应校验,服务端也需要解密参数。

前端页面js可做代码混淆,Compress就行,其实也没多大必要,离线打包做好代码混淆,获取用第三方的一些加密工具,IOS的用原生代码还是比较安全的,常规破解应该难度大。

以上纯粹个人的搞法,目前我这样用的,目前来说没啥问题,安全性算是加固了一些,希望各位大神多多指点!

继续阅读 »

javascript
初次使用Hbuilder时候,简直惊呆了,开发速度简直像开火箭般,原生代码android+IOS需要一个月的工作量,在Hbuilder上一周不到就解决了,简直不敢相信。
东西是做出来了,可是问题来了,ipa或apk安装文件解压,我嚓,,啥代码都能看到,这是在玩我么。。。
在网上查了各种资料,加密,混淆,基本用处不大,于是我在想,我请求的参数,请求的地址都能隐藏不就好了么,,
但是还有一个问题,随便使用一个HTTP抓包工具都能看到所有的东西,又郁闷了。。。。
最后一招,在所有的请求参数弄一个加密,从客户端到服务器都是密文,服务器再解密不就OK了么,想到这里就没发现又漏洞了。

请求地址,参数加密都放在原生代码完成,js调用方法获取,原生代码中可存相应的秘钥机制与服务器端对应校验,服务端也需要解密参数。

前端页面js可做代码混淆,Compress就行,其实也没多大必要,离线打包做好代码混淆,获取用第三方的一些加密工具,IOS的用原生代码还是比较安全的,常规破解应该难度大。

以上纯粹个人的搞法,目前我这样用的,目前来说没啥问题,安全性算是加固了一些,希望各位大神多多指点!

收起阅读 »

scroll 横向滚动图片一半解决办法

mui
<div class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">  
    <div class="mui-scroll">  
        <img src="xxxxx"/>  
     </div>  
</div>

横向图片只显示一半,须将mui-segmented-control-inverted该div设置一定的高度,以及mui-scroll top设置0即可

继续阅读 »
<div class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">  
    <div class="mui-scroll">  
        <img src="xxxxx"/>  
     </div>  
</div>

横向图片只显示一半,须将mui-segmented-control-inverted该div设置一定的高度,以及mui-scroll top设置0即可

收起阅读 »

js调用原生代码Activity返回数据

/
客户反馈华为的手机扫描二维码出现卡死,不能打开以及奔溃等,以前原生APP的扫描没问题,于是拷贝代码过来直接使用。
/

    if(plus.os.name == "Android")  
    {  
        var main = plus.android.runtimeMainActivity();  
        var Intent = plus.android.importClass("android.content.Intent");  
        var PrintTagActivity = plus.android.importClass("com.demo.CaptureActivity");//自己写的二维码扫描页面  
        var intent = new Intent();  
        intent.setClassName(main, 'com.demo.CaptureActivity');  
        main.startActivityForResult(intent, 100);  
        main.onActivityResult = function(requestCode, resultCode, data) {    
            if('100' == requestCode) {  
                plus.android.importClass(data);  
                var bundle=data.getExtras();  
                plus.android.importClass(bundle);  
                var ewm_no = bundle.getString("Code");///获取二维码信息  
            }  
        };  
    }else  
    {  
        mui.openWindow({  
            url: 'scanBarcode.html',   
            show:{  
              autoShow:true  
            }  
        });  
    }  
继续阅读 »

/
客户反馈华为的手机扫描二维码出现卡死,不能打开以及奔溃等,以前原生APP的扫描没问题,于是拷贝代码过来直接使用。
/

    if(plus.os.name == "Android")  
    {  
        var main = plus.android.runtimeMainActivity();  
        var Intent = plus.android.importClass("android.content.Intent");  
        var PrintTagActivity = plus.android.importClass("com.demo.CaptureActivity");//自己写的二维码扫描页面  
        var intent = new Intent();  
        intent.setClassName(main, 'com.demo.CaptureActivity');  
        main.startActivityForResult(intent, 100);  
        main.onActivityResult = function(requestCode, resultCode, data) {    
            if('100' == requestCode) {  
                plus.android.importClass(data);  
                var bundle=data.getExtras();  
                plus.android.importClass(bundle);  
                var ewm_no = bundle.getString("Code");///获取二维码信息  
            }  
        };  
    }else  
    {  
        mui.openWindow({  
            url: 'scanBarcode.html',   
            show:{  
              autoShow:true  
            }  
        });  
    }  
收起阅读 »