HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

5+App、wap2app的video、视频播放开发注意

video 视频

此文不适于uni-app,仅适于5+app

5+App、wap2app的视频播放有3种解决方案,使用HTML5的自带video、原生视频播放,以及使用Native.js调用外部播放器。

  1. HTML5自带video标签,可以播放符合HTML5规范的视频格式。
    注意不含flv、ra等三方商业公司的规范格式。
    HTML5的video在Android上有较多浏览器兼容性问题,这里有篇网友分享的经典文章讲述了HTML5 video的使用注意,http://ask.dcloud.net.cn/article/569
    注意事项,Android上使用video标签播放视频时,务必打开硬件加速,否则只有声音没有画面。
    HBuilder8.8.4以前的版本,在Android5的部分rom上是默认关闭硬件加速的,此时需强制打开硬件加速。创建webview时style里有个hardwareAccelerated参数,设置为true。
    硬件加速的详解参考文档http://ask.dcloud.net.cn/article/55
    视频全屏播放时有时不能自动横屏最大化,参考http://ask.dcloud.net.cn/article/1077
    HTML5自带video,如果想实现手势拖动进度,这里有篇参考文章http://ask.dcloud.net.cn/article/13263,但受限于HTML5的性能,拖动无法流畅跟手。
    从HBuilderX 2.5.3起,Android上新增了x5内核,使用x5播放视频,表现优于Webview自带的video标签。使用x5详见:https://ask.dcloud.net.cn/article/36806

iOS的视频播放,使用uiWebview和wkWebview有不同效果,wkWebview的视频播放自带AirPlay功能,可以直接连接电视。但需要注意wkWebview和uiWebview的差异,详见http://ask.dcloud.net.cn/article/1318

  1. 原生视频
    很多开发者对于HTML5自带视频有几处不满:
    a) 支持格式不丰富,比如flv
    b) 全屏后手势拖动不流畅,不能顺滑的拖动进度和音量、亮度
    在开发者提供直播推流时,5+引擎引入了专业视频解码库,也就顺便提供了plus.video的原生视频播放能力。
    但plus.video的原生视频播放会增加不少包体积,需要开发者自己平衡好需求。
    5+App里原生视频控件需要使用js创建,参考http://www.html5plus.org/doc/zh_cn/video.html
    uni-app里的video组件,默认不是HTML的video,默认就是原生video。
    使用原生video注意它的层级较高,覆盖原生控件,在5+app里使用plus.nativeObj.view,在uni-app里使用cover-view、plus.nativeObj.view、subnvue都可以,如果是nvue,那不存在层级问题,并且全屏后的视频也可以随意自定义界面。从体验角度,最好的是nvue的video。

  2. 除了HTML5的video,开发者也可以在Android上使用Native.js调用系统播放器来放视频。
    但视频的播放进度等状态无法回传给js层。
    参考http://ask.dcloud.net.cn/question/614

继续阅读 »

此文不适于uni-app,仅适于5+app

5+App、wap2app的视频播放有3种解决方案,使用HTML5的自带video、原生视频播放,以及使用Native.js调用外部播放器。

  1. HTML5自带video标签,可以播放符合HTML5规范的视频格式。
    注意不含flv、ra等三方商业公司的规范格式。
    HTML5的video在Android上有较多浏览器兼容性问题,这里有篇网友分享的经典文章讲述了HTML5 video的使用注意,http://ask.dcloud.net.cn/article/569
    注意事项,Android上使用video标签播放视频时,务必打开硬件加速,否则只有声音没有画面。
    HBuilder8.8.4以前的版本,在Android5的部分rom上是默认关闭硬件加速的,此时需强制打开硬件加速。创建webview时style里有个hardwareAccelerated参数,设置为true。
    硬件加速的详解参考文档http://ask.dcloud.net.cn/article/55
    视频全屏播放时有时不能自动横屏最大化,参考http://ask.dcloud.net.cn/article/1077
    HTML5自带video,如果想实现手势拖动进度,这里有篇参考文章http://ask.dcloud.net.cn/article/13263,但受限于HTML5的性能,拖动无法流畅跟手。
    从HBuilderX 2.5.3起,Android上新增了x5内核,使用x5播放视频,表现优于Webview自带的video标签。使用x5详见:https://ask.dcloud.net.cn/article/36806

iOS的视频播放,使用uiWebview和wkWebview有不同效果,wkWebview的视频播放自带AirPlay功能,可以直接连接电视。但需要注意wkWebview和uiWebview的差异,详见http://ask.dcloud.net.cn/article/1318

  1. 原生视频
    很多开发者对于HTML5自带视频有几处不满:
    a) 支持格式不丰富,比如flv
    b) 全屏后手势拖动不流畅,不能顺滑的拖动进度和音量、亮度
    在开发者提供直播推流时,5+引擎引入了专业视频解码库,也就顺便提供了plus.video的原生视频播放能力。
    但plus.video的原生视频播放会增加不少包体积,需要开发者自己平衡好需求。
    5+App里原生视频控件需要使用js创建,参考http://www.html5plus.org/doc/zh_cn/video.html
    uni-app里的video组件,默认不是HTML的video,默认就是原生video。
    使用原生video注意它的层级较高,覆盖原生控件,在5+app里使用plus.nativeObj.view,在uni-app里使用cover-view、plus.nativeObj.view、subnvue都可以,如果是nvue,那不存在层级问题,并且全屏后的视频也可以随意自定义界面。从体验角度,最好的是nvue的video。

  2. 除了HTML5的video,开发者也可以在Android上使用Native.js调用系统播放器来放视频。
    但视频的播放进度等状态无法回传给js层。
    参考http://ask.dcloud.net.cn/question/614

收起阅读 »

modal 弹出浮层的使用方法

.mui-modal {top:300px !important;}      
.mui-content{overflow-y:auto;}

.mui-modal {top:300px !important;} 用来控制距离顶部高度
.mui-content{overflow-y:auto;} 用来控制内容溢出后的自动上下滚动

就是浮层的背景遮罩效果暂时还不知道怎么弄

mui是好东西,但是文档真的太弱了,这个modal 都是藏在例子中的。。。。

再提供下这个例子的路径 :examples/modals.html

继续阅读 »
.mui-modal {top:300px !important;}      
.mui-content{overflow-y:auto;}

.mui-modal {top:300px !important;} 用来控制距离顶部高度
.mui-content{overflow-y:auto;} 用来控制内容溢出后的自动上下滚动

就是浮层的背景遮罩效果暂时还不知道怎么弄

mui是好东西,但是文档真的太弱了,这个modal 都是藏在例子中的。。。。

再提供下这个例子的路径 :examples/modals.html

收起阅读 »

安利一个小应用,以wordpress为后台的博客/资讯应用

以wordpress的Rest Api构建的app

  1. 为wordpress安装wp rest api插件
  2. 修改代码中url地址和菜单参数即可打包成自己的app
    和现有wordpress站点完美结合,pc+移动端,完美覆盖。

源码地址:GITHUB
(先占个坑,有空来完善,最近较忙,代码未整理,欢迎拍砖。)
还有很多功能未实现。。。。下载地址:http://pan.baidu.com/s/1i47SSTn

继续阅读 »

以wordpress的Rest Api构建的app

  1. 为wordpress安装wp rest api插件
  2. 修改代码中url地址和菜单参数即可打包成自己的app
    和现有wordpress站点完美结合,pc+移动端,完美覆盖。

源码地址:GITHUB
(先占个坑,有空来完善,最近较忙,代码未整理,欢迎拍砖。)
还有很多功能未实现。。。。下载地址:http://pan.baidu.com/s/1i47SSTn

收起阅读 »

HBuilder常用js汇总

/*  
 * 服务器的地址  
 */  
var strservicef = '';  
var strservices = '';  

/*  
 * 主要的公共函数  
 */  
var Fun_App = {  
    /**  
     * 完整的打开新页面方法  
     * @param {Object} _url  
     */  
    OpenPage: function(id, gethtmlurl,action,sendvalue) {  
        var page = mui.preload({  
            url:gethtmlurl,  
            id: gethtmlurl,  
        });  
        var getid = document.getElementById(id);  
        getid.addEventListener('tap', function() {  
                mui.openWindow({  
                    url:gethtmlurl,  
                    id:gethtmlurl,  
                    styles:{  
                      top:"44px",  
                      bottom:"50px",  
                      width:"100%",  
                      height:"100%"  
                    },  
                    extras:{  
                      kid:sendvalue  
                    },  
                    show:{  
                      autoShow:true,//页面loaded事件发生后自动显示,默认为true  
                      aniShow:action,//页面显示动画,默认为”slide-in-right“;  
                      duration:100//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;  
                    },  
                    waiting:{  
                      autoShow:true,//自动显示等待框,默认为true  
                      title:"正在加载..."//等待对话框上显示的提示内容  
                    }  
                })  
        });  
    },  
    /*  
     * 页面间传值的获取  
     */  
    getextrasdata: function(kid){  
        var self = plus.webview.currentWebview();  
        return self.kid;  
    },  
    /*  
     * ajax 数据请求方法  
     */  
    ExAjax: function(url, rdata) {  
        mui.ajax({  
            url: url,  
            type: "post",  
            data: rdata.config,  
            dataType: 'json',  
            timeout:10000,  
            success: function(data) {  
                rdata.fun_Success(data);  
            },  
            error: function(xhr, type, errorThrown) {  
                console.log(JSON.stringify(xhr) + type + "---" + errorThrown);  
            }  
        });  
    },  
    /*  
     * 数据存储的函数  
     */  
    storagedata: function(kname,sdata){  
        localStorage.setItem(kname,sdata);  
    },  
    /*  
     * 数据读取  
     */  
    getdata: function(kname){  
        return localStorage.getItem(kname);  
    },  
    /*  
     * 数据删除  
     */  
    deldata: function(kname){  
        localStorage.removeItem(kname);  
    },  
    /*  
     * 手势配置  
     */  
    gesture: function(){  
        var gs = {  
            gestureConfig:{  
               tap: true, //默认为true  
               doubletap: true, //默认为false  
               longtap: true, //默认为false  
               swipe: true, //默认为true  
               drag: true //默认为true  
        }  
        };  
        return gs;  
    },  
    /*  
     * 隐藏滚动条  
     */  
    delscroll: function(){  
        plus.webview.currentWebview().setStyle({  
            scrollIndicator: 'none',  
        });  
    },  
    /*   
     * 返回键退出程序  
     * 1秒内,连续两次按返回键,则退出应用  
     */  
    FunBackQuitAppL: function(){  
        var backFirst = null;  
        this.QuitApp = function() {  
            //首次按键,提示‘再按一次退出应用’  
            if (!backFirst) {  
                backFirst = new Date().getTime();  
                mui.toast('再按一次退出应用程序');  
                setTimeout(function() {  
                    backFirst = null;  
                }, 1000);  
            } else {  
                if ((new Date()).getTime() - backFirst < 1000) {  
                    plus.runtime.quit();  
                }  
            }  
        }  
    }  
}  
继续阅读 »
/*  
 * 服务器的地址  
 */  
var strservicef = '';  
var strservices = '';  

/*  
 * 主要的公共函数  
 */  
var Fun_App = {  
    /**  
     * 完整的打开新页面方法  
     * @param {Object} _url  
     */  
    OpenPage: function(id, gethtmlurl,action,sendvalue) {  
        var page = mui.preload({  
            url:gethtmlurl,  
            id: gethtmlurl,  
        });  
        var getid = document.getElementById(id);  
        getid.addEventListener('tap', function() {  
                mui.openWindow({  
                    url:gethtmlurl,  
                    id:gethtmlurl,  
                    styles:{  
                      top:"44px",  
                      bottom:"50px",  
                      width:"100%",  
                      height:"100%"  
                    },  
                    extras:{  
                      kid:sendvalue  
                    },  
                    show:{  
                      autoShow:true,//页面loaded事件发生后自动显示,默认为true  
                      aniShow:action,//页面显示动画,默认为”slide-in-right“;  
                      duration:100//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;  
                    },  
                    waiting:{  
                      autoShow:true,//自动显示等待框,默认为true  
                      title:"正在加载..."//等待对话框上显示的提示内容  
                    }  
                })  
        });  
    },  
    /*  
     * 页面间传值的获取  
     */  
    getextrasdata: function(kid){  
        var self = plus.webview.currentWebview();  
        return self.kid;  
    },  
    /*  
     * ajax 数据请求方法  
     */  
    ExAjax: function(url, rdata) {  
        mui.ajax({  
            url: url,  
            type: "post",  
            data: rdata.config,  
            dataType: 'json',  
            timeout:10000,  
            success: function(data) {  
                rdata.fun_Success(data);  
            },  
            error: function(xhr, type, errorThrown) {  
                console.log(JSON.stringify(xhr) + type + "---" + errorThrown);  
            }  
        });  
    },  
    /*  
     * 数据存储的函数  
     */  
    storagedata: function(kname,sdata){  
        localStorage.setItem(kname,sdata);  
    },  
    /*  
     * 数据读取  
     */  
    getdata: function(kname){  
        return localStorage.getItem(kname);  
    },  
    /*  
     * 数据删除  
     */  
    deldata: function(kname){  
        localStorage.removeItem(kname);  
    },  
    /*  
     * 手势配置  
     */  
    gesture: function(){  
        var gs = {  
            gestureConfig:{  
               tap: true, //默认为true  
               doubletap: true, //默认为false  
               longtap: true, //默认为false  
               swipe: true, //默认为true  
               drag: true //默认为true  
        }  
        };  
        return gs;  
    },  
    /*  
     * 隐藏滚动条  
     */  
    delscroll: function(){  
        plus.webview.currentWebview().setStyle({  
            scrollIndicator: 'none',  
        });  
    },  
    /*   
     * 返回键退出程序  
     * 1秒内,连续两次按返回键,则退出应用  
     */  
    FunBackQuitAppL: function(){  
        var backFirst = null;  
        this.QuitApp = function() {  
            //首次按键,提示‘再按一次退出应用’  
            if (!backFirst) {  
                backFirst = new Date().getTime();  
                mui.toast('再按一次退出应用程序');  
                setTimeout(function() {  
                    backFirst = null;  
                }, 1000);  
            } else {  
                if ((new Date()).getTime() - backFirst < 1000) {  
                    plus.runtime.quit();  
                }  
            }  
        }  
    }  
}  
收起阅读 »

切图网招聘 响应式前端 数名

HBuilder

要求 能基于 css3 多媒体查询做 响应式网站 ,18~ 30 岁,男女不限, 要求会用 hbuilder 进行开发。 联系qq/微信:6135833 , 地址 在荆州。

要求 能基于 css3 多媒体查询做 响应式网站 ,18~ 30 岁,男女不限, 要求会用 hbuilder 进行开发。 联系qq/微信:6135833 , 地址 在荆州。

DCloud发布gostream.js,一行代码把wap流量转App流量

流应用

Wap流量转化太低,流量主伤不起
  

  随着移动App的兴起,越来越多的网站开始把自身的wap站流量导向自己的App,但是传统的导流方法还是比较老套,比如在网站的首页挂个“下载客户端”的按钮,但这种方式的转化率很低,大多都是百分之几。
  
  但是用户依旧会光临你的wap站,是因为用户还需要内容,并且市场上浏览器、搜索引擎的流量仍然是巨大的。但是用户却不想花费1分钟下载安装沉重的App,怎么解决?
  
  DCloud公司现在提供了一个免费的gostream.js,把这个js嵌入到你的wap页面里,用户访问你的wap站时,可以直接秒装流应用并打开(流应用是什么下面讲),同时还会在用户的Android手机桌面安装图标,实现wap站之前梦寐以求的桌面留存。
  
  (只需引入如下js文件,即可实现wap流量转App)

  
  gostream.js是什么黑科技?
  
  Wap流量秒转App流量,这么神奇?
  
  这种世界级难题竟然被解决了?这是什么原理呢?
  
  这里需要先引入一个概念叫流应用。
  
  流应用是DCloud公司的产品,一种把App安装包大幅压缩并且流式下载安装到手机上的技术。一个流应用的体积一般只有几百k,并且是边用边下,只需先下载几十K,应用就可以启动,然后用户一边使用App一边系统在后台持续下载完成。就像我们在线看流媒体电影,也是边看边播。
  
  流应用是随着移动互联网带宽升级及新技术突破而引来的创新模式。
  
  而gostream.js则基于流应用更进一步。
  
  在wap站上内嵌这个js,这个js可以检测手机上有没有流应用引擎,如果有的话,可以直接启动流应用引擎,秒装秒开流应用。
  
  对,流应用的边用边下需要手机已经安装了流应用引擎,这个客户端引擎配合DCloud的专利技术的流应用服务器才能实现边用边下。
  
  那么问题来了,流应用引擎有多少装机量呢?如果量不够,实际导流效果还是不会好啊。
  
  答案是:DCloud的流应用引擎已经有上亿装机量,目前的检测数据是每3台Android设备就有1台能检测到流应用引擎。
  
  如何体验效果?
  
  用你的手机浏览器访问http://dcloud.io/demo/gostream/,如果你手机上没有流应用引擎,会提示你安装引擎。
  
  这里是体验视频:http://v.qq.com/page/t/9/8/t0190xh3198.html

  
  gostream.js其他更多用途
  
  除了wap站导流到流应用,gostream.js还能用于更多导流方案。
  
  1. 分享导流,通过在分享的url页面里挂gostream.js,可以实现通过社交途径带动应用发行。
  
  2. 广告sdk导流,广告sdk导流到wap时体验差,导流到App时折损高。那么在导流到wap时引入gostream.js,即可降低折损、增强体验。
  
  3. App互导流,在App中集成流应用引擎或检测手机端的流应用引擎,均可实现更高效的导流方案。
  
  本质上流应用是一种极高效率、优质体验的导流技术,随着移动互联网第一拨流量红利的结束,流应用打开了新的流量蓝海!

更多详情,请点击>>http://ask.dcloud.net.cn/article/579
  
  附录:DCloud CEO在Google for publishers论坛的演讲:揭秘H5流量为什么不值钱?
  
  2016年3月1日,Google在北京举行Google for publishers论坛。活动吸引了数百位广告主、流量主和开发者参加。DCloud创始人王安在会上分享的H5流量为什么低廉以及如何提升H5流量价值等问题,深受参会人员关注。
  
  下文为DCloud创始人王安分享的观点:
  
  大家都知道,目前H5的流量按pv卖,一个pv几毛钱,而App的流量按下载或激活卖,一个下载几元,一个激活可能十几元。为什么H5的流量比App便宜这么多?大家想过没有。
  
  有人说H5获取容易但体验不行,所以流量便宜。App获取不容易,但体验好,所以流量贵。
  
  简单看是这个意思,但深入分析进去,不是体验差可以概括的。从数据运营的角度看,H5从入口流量开始,注册转换、付费转换、留存都远低于App。广告主买来的H5流量,很难留住用户和持续变现,这倒逼着广告主无法支付给H5流量过高的采购价格。
  
  难道H5流量廉价的现状就无法改变了吗?其实不是。摸清病,就可以对症下药。
  
  1. 优化HTML5的功能和体验,达到原生效果
  
  先从体验开始说起,大家提到DCloud一般都能想到,DCloud之前最著名的就是解决HTML5“性工能”缺失问题,是的,这几年DCloud通过Hbuilder、HTML5+、MUI几个免费和开源的产品,把HTML5的性能、工具、能力做到跟原生接近,普通用户难以感知区别。
  
  包括流畅的窗体切换动画、长列表滚动、下拉刷新这些用户体验优化,还有40万原生API的调用,这些问题都已解决了。具体怎么实现以前经常讲,这里就不讲了,没听过的可以上我们官网看,http://www.DCloud.io
  
  2. 优化HTML5的运营折损
  
  除了感性的体验优化,我们更在数据运营层面做了很多优化来避免折损。
  
  经过强化的HTML5+,用户用手机号注册时也可以截获短信验证码启动填入输入框,也可以调用微信、QQ、微博单点登陆,在注册环节的折损和原生App保持一致。
  
  除了注册,在支付环节也一样,经过强化的HTML5+也可以调起支付宝、微信原生支付以及苹果应用内支付IAP。
  
  这样HTML5+从入口流量开始,到注册转换和付费转换,是不会比原生有差距的。
  
  3. 提升留存
  
  然后剩下问题就是留存了。
  
  H5与App相比,留存率低一般2个原因:
  
  a) 体验不好下次不用了。这个上面提到已经解决了。
  
  b) 另一个重要原因是H5页面在桌面没有图标。
  
  这里我要引入一个概念,叫“流应用”,也是DCloud的重要产品,目前有上亿装机量。
  
  用户在访问一个浏览器网页时,是不会在桌面留存图标的,那叫在线浏览。流应用虽然是使用经过强化的HTML5+开发,但引入了安装的概念,在桌面留有图标。但这种安装呢,又不像原生App安装那么麻烦,流应用和流媒体的概念类似,有缓冲和边用边下的概念,一点你就能用,但边用边装,一会儿就整个App安装完毕了。
  
  大家可以在360手机助手里体验,手机上打开360手机助手,搜索大众点评外卖,可以看到列表里的按钮不叫下载了,叫“秒开”,一点后,App直接启动并同时安装在桌面。
  
  参考体验视频http://v.qq.com/page/i/c/f/i0171dyo7cf.html

  
  所以,留存率低于原生的问题也解决了。
  
  经过强化的HTML5+,通过流应用方式驻留在桌面,在功能体验和运营数据上都可以达到原生App标准。HTML5的流量价值将可以和原生狠狠拼一把了。
  
  有人问了,通过应用市场加载流应用虽然挺好,但我原来的浏览器里的H5流量怎么利用和提价啊。
  
  Good question!
  
  以往的做法是wap站上挂一个banner引导用户下载原生App,实际上转化率非常低。
  
  现在DCloud提供了一个免费的js,gostream.js,把这个js嵌入到你的H5页面里,这个js检测到手机有流应用引擎时,可以直接秒开流应用并安装到手机里。刚才讲了我们的流应用引擎已经有上亿装机量,目前我们的测试数据是每3台Android设备就有一台检测到流应用引擎。
  
  具体的集成地址是:<script src="http://cdn.dcloud.net.cn/gostream.min.js?Appid=HelloMUI">
  
  注意Appid的值更换为自己的流应用的Appid。
  
  So,就是这么简单,就可以把wap流量变成App流量。
  
  技术人员在这里看到了很酷的新技术,广告主看到了更高效的推广方式,渠道也可以看了很多商机,我们目前的渠道合作分成政策也很优惠。
  
  大家可以继续关注我们的公众号或访问我们DCloud的网站深入了解。

继续阅读 »

Wap流量转化太低,流量主伤不起
  

  随着移动App的兴起,越来越多的网站开始把自身的wap站流量导向自己的App,但是传统的导流方法还是比较老套,比如在网站的首页挂个“下载客户端”的按钮,但这种方式的转化率很低,大多都是百分之几。
  
  但是用户依旧会光临你的wap站,是因为用户还需要内容,并且市场上浏览器、搜索引擎的流量仍然是巨大的。但是用户却不想花费1分钟下载安装沉重的App,怎么解决?
  
  DCloud公司现在提供了一个免费的gostream.js,把这个js嵌入到你的wap页面里,用户访问你的wap站时,可以直接秒装流应用并打开(流应用是什么下面讲),同时还会在用户的Android手机桌面安装图标,实现wap站之前梦寐以求的桌面留存。
  
  (只需引入如下js文件,即可实现wap流量转App)

  
  gostream.js是什么黑科技?
  
  Wap流量秒转App流量,这么神奇?
  
  这种世界级难题竟然被解决了?这是什么原理呢?
  
  这里需要先引入一个概念叫流应用。
  
  流应用是DCloud公司的产品,一种把App安装包大幅压缩并且流式下载安装到手机上的技术。一个流应用的体积一般只有几百k,并且是边用边下,只需先下载几十K,应用就可以启动,然后用户一边使用App一边系统在后台持续下载完成。就像我们在线看流媒体电影,也是边看边播。
  
  流应用是随着移动互联网带宽升级及新技术突破而引来的创新模式。
  
  而gostream.js则基于流应用更进一步。
  
  在wap站上内嵌这个js,这个js可以检测手机上有没有流应用引擎,如果有的话,可以直接启动流应用引擎,秒装秒开流应用。
  
  对,流应用的边用边下需要手机已经安装了流应用引擎,这个客户端引擎配合DCloud的专利技术的流应用服务器才能实现边用边下。
  
  那么问题来了,流应用引擎有多少装机量呢?如果量不够,实际导流效果还是不会好啊。
  
  答案是:DCloud的流应用引擎已经有上亿装机量,目前的检测数据是每3台Android设备就有1台能检测到流应用引擎。
  
  如何体验效果?
  
  用你的手机浏览器访问http://dcloud.io/demo/gostream/,如果你手机上没有流应用引擎,会提示你安装引擎。
  
  这里是体验视频:http://v.qq.com/page/t/9/8/t0190xh3198.html

  
  gostream.js其他更多用途
  
  除了wap站导流到流应用,gostream.js还能用于更多导流方案。
  
  1. 分享导流,通过在分享的url页面里挂gostream.js,可以实现通过社交途径带动应用发行。
  
  2. 广告sdk导流,广告sdk导流到wap时体验差,导流到App时折损高。那么在导流到wap时引入gostream.js,即可降低折损、增强体验。
  
  3. App互导流,在App中集成流应用引擎或检测手机端的流应用引擎,均可实现更高效的导流方案。
  
  本质上流应用是一种极高效率、优质体验的导流技术,随着移动互联网第一拨流量红利的结束,流应用打开了新的流量蓝海!

更多详情,请点击>>http://ask.dcloud.net.cn/article/579
  
  附录:DCloud CEO在Google for publishers论坛的演讲:揭秘H5流量为什么不值钱?
  
  2016年3月1日,Google在北京举行Google for publishers论坛。活动吸引了数百位广告主、流量主和开发者参加。DCloud创始人王安在会上分享的H5流量为什么低廉以及如何提升H5流量价值等问题,深受参会人员关注。
  
  下文为DCloud创始人王安分享的观点:
  
  大家都知道,目前H5的流量按pv卖,一个pv几毛钱,而App的流量按下载或激活卖,一个下载几元,一个激活可能十几元。为什么H5的流量比App便宜这么多?大家想过没有。
  
  有人说H5获取容易但体验不行,所以流量便宜。App获取不容易,但体验好,所以流量贵。
  
  简单看是这个意思,但深入分析进去,不是体验差可以概括的。从数据运营的角度看,H5从入口流量开始,注册转换、付费转换、留存都远低于App。广告主买来的H5流量,很难留住用户和持续变现,这倒逼着广告主无法支付给H5流量过高的采购价格。
  
  难道H5流量廉价的现状就无法改变了吗?其实不是。摸清病,就可以对症下药。
  
  1. 优化HTML5的功能和体验,达到原生效果
  
  先从体验开始说起,大家提到DCloud一般都能想到,DCloud之前最著名的就是解决HTML5“性工能”缺失问题,是的,这几年DCloud通过Hbuilder、HTML5+、MUI几个免费和开源的产品,把HTML5的性能、工具、能力做到跟原生接近,普通用户难以感知区别。
  
  包括流畅的窗体切换动画、长列表滚动、下拉刷新这些用户体验优化,还有40万原生API的调用,这些问题都已解决了。具体怎么实现以前经常讲,这里就不讲了,没听过的可以上我们官网看,http://www.DCloud.io
  
  2. 优化HTML5的运营折损
  
  除了感性的体验优化,我们更在数据运营层面做了很多优化来避免折损。
  
  经过强化的HTML5+,用户用手机号注册时也可以截获短信验证码启动填入输入框,也可以调用微信、QQ、微博单点登陆,在注册环节的折损和原生App保持一致。
  
  除了注册,在支付环节也一样,经过强化的HTML5+也可以调起支付宝、微信原生支付以及苹果应用内支付IAP。
  
  这样HTML5+从入口流量开始,到注册转换和付费转换,是不会比原生有差距的。
  
  3. 提升留存
  
  然后剩下问题就是留存了。
  
  H5与App相比,留存率低一般2个原因:
  
  a) 体验不好下次不用了。这个上面提到已经解决了。
  
  b) 另一个重要原因是H5页面在桌面没有图标。
  
  这里我要引入一个概念,叫“流应用”,也是DCloud的重要产品,目前有上亿装机量。
  
  用户在访问一个浏览器网页时,是不会在桌面留存图标的,那叫在线浏览。流应用虽然是使用经过强化的HTML5+开发,但引入了安装的概念,在桌面留有图标。但这种安装呢,又不像原生App安装那么麻烦,流应用和流媒体的概念类似,有缓冲和边用边下的概念,一点你就能用,但边用边装,一会儿就整个App安装完毕了。
  
  大家可以在360手机助手里体验,手机上打开360手机助手,搜索大众点评外卖,可以看到列表里的按钮不叫下载了,叫“秒开”,一点后,App直接启动并同时安装在桌面。
  
  参考体验视频http://v.qq.com/page/i/c/f/i0171dyo7cf.html

  
  所以,留存率低于原生的问题也解决了。
  
  经过强化的HTML5+,通过流应用方式驻留在桌面,在功能体验和运营数据上都可以达到原生App标准。HTML5的流量价值将可以和原生狠狠拼一把了。
  
  有人问了,通过应用市场加载流应用虽然挺好,但我原来的浏览器里的H5流量怎么利用和提价啊。
  
  Good question!
  
  以往的做法是wap站上挂一个banner引导用户下载原生App,实际上转化率非常低。
  
  现在DCloud提供了一个免费的js,gostream.js,把这个js嵌入到你的H5页面里,这个js检测到手机有流应用引擎时,可以直接秒开流应用并安装到手机里。刚才讲了我们的流应用引擎已经有上亿装机量,目前我们的测试数据是每3台Android设备就有一台检测到流应用引擎。
  
  具体的集成地址是:<script src="http://cdn.dcloud.net.cn/gostream.min.js?Appid=HelloMUI">
  
  注意Appid的值更换为自己的流应用的Appid。
  
  So,就是这么简单,就可以把wap流量变成App流量。
  
  技术人员在这里看到了很酷的新技术,广告主看到了更高效的推广方式,渠道也可以看了很多商机,我们目前的渠道合作分成政策也很优惠。
  
  大家可以继续关注我们的公众号或访问我们DCloud的网站深入了解。

收起阅读 »

揭秘H5流量为什么不如App值钱?

流应用

 3月1日,Google在其北京办公室举行Google for publishers论坛 。活动吸引了数百位广告主、流量主和开发者参加。DCloud创始人王安在会上分享的H5流量为什么低廉以及如何提升H5流量价值等问题,深受参会人员关注。

 下文为DCloud创始人王安分享的观点:

大家都知道,目前H5的流量按pv卖,一个pv几毛钱,而App的流量按下载或激活卖,一个下载几元,一个激活可能十几元。为什么H5的流量比App便宜这么多?大家想过没有。

 有人说H5获取容易但体验不行,所以流量便宜。App获取不容易,但体验好,所以流量贵。

 简单看是这个意思,但深入分析进去,不是体验差可以概括的。从数据运营的角度看,H5从入口流量开始,注册转换、付费转换、留存都远低于App。广告主买来的H5流量,很难留住用户和持续变现,这倒逼着广告主无法支付给H5流量过高的采购价格。

 难道H5流量廉价的现状就无法改变了吗?其实不是。摸清病,就可以对症下药。

 1.优化HTML5的功能和体验,达到原生效果

 先从体验开始说起,大家提到DCloud一般都能想到,哦,那家可以解决HTML5“性工能”缺失的公司,是的,这几年DCloud通过Hbuilder、HTML5 、MUI几个免费和开源的产品,把HTML5的性能、工具、能力做到跟原生接近,普通用户难以感知区别。

 包括流畅的窗体切换动画、长列表滚动、下拉刷新这些用户体验优化,还有40万原生API的调用,这些问题都已解决了。具体怎么实现以前经常讲,这里就不讲了,没听过的可以上我们官网看,http://www.DCloud.io

  2.优化HTML5的运营折损 

 除了感性的体验优化,我们更在数据运营层面做了很多优化来避免折损。

 经过强化的HTML5 ,用户用手机号注册时也可以截获短信验证码启动填入输入框,也可以调用微信、QQ、微博单点登陆,在注册环节的折损和原生App保持一致。

 除了注册,在支付环节也一样,经过强化的HTML5 也可以调起支付宝、微信原生支付以及苹果应用内支付IAP。

 这样HTML5 从入口流量开始,到注册转换和付费转换,是不会比原生有差距的。

  3.提升留存 

 然后剩下问题就是留存了。

 H5与App相比,留存率低一般2个原因:

 a) 体验不好下次不用了。这个上面提到已经解决了。

 b) 另一个重要原因是H5页面在桌面没有图标。

 这里我要引入一个概念,叫“流应用”,也是DCloud的重要产品,目前有上亿装机量。

 用户在访问一个浏览器网页时,是不会在桌面留存图标的,那叫在线浏览。流应用虽然是使用经过强化的HTML5 开发,但引入了安装的概念,在桌面留有图标。但这种安装呢,又不像原生App安装那么麻烦,流应用和流媒体的概念类似,有缓冲和边用边下的概念,一点你就能用,但边用边装,一会儿就整个App安装完毕了。

 大家可以在360手机助手里体验,手机上打开360手机助手,搜索大众点评外卖,可以看到列表里的按钮不叫下载了,叫“秒开”,一点后,App直接启动并同时安装在桌面。

  参考体验视频: 

http://v.qq.com/boke/gplay/c17d8789e7dd8a208cd6e6189ae90664_nst000001qufah3_i0171dyo7cf.html

 所以,留存率低于原生的问题也解决了。

 经过强化的HTML5 ,通过流应用方式驻留在桌面,在功能体验和运营数据上都可以达到原生App标准。HTML5的流量价值将可以和原生狠狠拼一把了。

 有人问了,通过应用市场加载流应用虽然挺好,但我原来的浏览器里的H5流量怎么利用和提价啊。

 Good question!

 DCloud提供了一个免费的js,把这个js嵌入到你的H5页面里,这个js检测到手机有流应用引擎时,可以直接秒开流应用并安装到手机里。刚才讲了我们的流应用引擎已经有一亿多装机量,目前我们的测试数据是每3台Android设备就有一台检测到流应用引擎。

 技术人员在这里看到了很酷的新技术,广告主看到了更高效的推广方式,渠道也可以看了很多商机,我们目前的渠道合作分成政策也很优惠。

 大家可以继续关注我们的公众号或访问我们DCloud的网站深入了解。

  后记: 

 流应用安装的意义不止是为了桌面驻留。

 b/s的网页有几个问题,无网会404白屏,加载页面时是数据和界面一起下载,这导致流量大,切换页面慢,中间容易白屏。

 而App是c/s结构的,其界面是在本地的,从服务器只取很小的json,流量小,切换页面快。这也是App体验比web好的重要原因之一。

 但传统App的安装过程很复杂,一个app从下载开始,到安装完毕成功启动,需要耗时一分钟,激活率一般只有50%。

 流应用是边用边下的,所以既保持了c/s的App级别的优质用户体验,又避免了下载安装启动的激活折损。流应用同时结合了c/s和b/s的优势又避免了他们的缺点,这才是下一代移动互联网代表的方向。

继续阅读 »

 3月1日,Google在其北京办公室举行Google for publishers论坛 。活动吸引了数百位广告主、流量主和开发者参加。DCloud创始人王安在会上分享的H5流量为什么低廉以及如何提升H5流量价值等问题,深受参会人员关注。

 下文为DCloud创始人王安分享的观点:

大家都知道,目前H5的流量按pv卖,一个pv几毛钱,而App的流量按下载或激活卖,一个下载几元,一个激活可能十几元。为什么H5的流量比App便宜这么多?大家想过没有。

 有人说H5获取容易但体验不行,所以流量便宜。App获取不容易,但体验好,所以流量贵。

 简单看是这个意思,但深入分析进去,不是体验差可以概括的。从数据运营的角度看,H5从入口流量开始,注册转换、付费转换、留存都远低于App。广告主买来的H5流量,很难留住用户和持续变现,这倒逼着广告主无法支付给H5流量过高的采购价格。

 难道H5流量廉价的现状就无法改变了吗?其实不是。摸清病,就可以对症下药。

 1.优化HTML5的功能和体验,达到原生效果

 先从体验开始说起,大家提到DCloud一般都能想到,哦,那家可以解决HTML5“性工能”缺失的公司,是的,这几年DCloud通过Hbuilder、HTML5 、MUI几个免费和开源的产品,把HTML5的性能、工具、能力做到跟原生接近,普通用户难以感知区别。

 包括流畅的窗体切换动画、长列表滚动、下拉刷新这些用户体验优化,还有40万原生API的调用,这些问题都已解决了。具体怎么实现以前经常讲,这里就不讲了,没听过的可以上我们官网看,http://www.DCloud.io

  2.优化HTML5的运营折损 

 除了感性的体验优化,我们更在数据运营层面做了很多优化来避免折损。

 经过强化的HTML5 ,用户用手机号注册时也可以截获短信验证码启动填入输入框,也可以调用微信、QQ、微博单点登陆,在注册环节的折损和原生App保持一致。

 除了注册,在支付环节也一样,经过强化的HTML5 也可以调起支付宝、微信原生支付以及苹果应用内支付IAP。

 这样HTML5 从入口流量开始,到注册转换和付费转换,是不会比原生有差距的。

  3.提升留存 

 然后剩下问题就是留存了。

 H5与App相比,留存率低一般2个原因:

 a) 体验不好下次不用了。这个上面提到已经解决了。

 b) 另一个重要原因是H5页面在桌面没有图标。

 这里我要引入一个概念,叫“流应用”,也是DCloud的重要产品,目前有上亿装机量。

 用户在访问一个浏览器网页时,是不会在桌面留存图标的,那叫在线浏览。流应用虽然是使用经过强化的HTML5 开发,但引入了安装的概念,在桌面留有图标。但这种安装呢,又不像原生App安装那么麻烦,流应用和流媒体的概念类似,有缓冲和边用边下的概念,一点你就能用,但边用边装,一会儿就整个App安装完毕了。

 大家可以在360手机助手里体验,手机上打开360手机助手,搜索大众点评外卖,可以看到列表里的按钮不叫下载了,叫“秒开”,一点后,App直接启动并同时安装在桌面。

  参考体验视频: 

http://v.qq.com/boke/gplay/c17d8789e7dd8a208cd6e6189ae90664_nst000001qufah3_i0171dyo7cf.html

 所以,留存率低于原生的问题也解决了。

 经过强化的HTML5 ,通过流应用方式驻留在桌面,在功能体验和运营数据上都可以达到原生App标准。HTML5的流量价值将可以和原生狠狠拼一把了。

 有人问了,通过应用市场加载流应用虽然挺好,但我原来的浏览器里的H5流量怎么利用和提价啊。

 Good question!

 DCloud提供了一个免费的js,把这个js嵌入到你的H5页面里,这个js检测到手机有流应用引擎时,可以直接秒开流应用并安装到手机里。刚才讲了我们的流应用引擎已经有一亿多装机量,目前我们的测试数据是每3台Android设备就有一台检测到流应用引擎。

 技术人员在这里看到了很酷的新技术,广告主看到了更高效的推广方式,渠道也可以看了很多商机,我们目前的渠道合作分成政策也很优惠。

 大家可以继续关注我们的公众号或访问我们DCloud的网站深入了解。

  后记: 

 流应用安装的意义不止是为了桌面驻留。

 b/s的网页有几个问题,无网会404白屏,加载页面时是数据和界面一起下载,这导致流量大,切换页面慢,中间容易白屏。

 而App是c/s结构的,其界面是在本地的,从服务器只取很小的json,流量小,切换页面快。这也是App体验比web好的重要原因之一。

 但传统App的安装过程很复杂,一个app从下载开始,到安装完毕成功启动,需要耗时一分钟,激活率一般只有50%。

 流应用是边用边下的,所以既保持了c/s的App级别的优质用户体验,又避免了下载安装启动的激活折损。流应用同时结合了c/s和b/s的优势又避免了他们的缺点,这才是下一代移动互联网代表的方向。

收起阅读 »

增加分栏目方法 title

一个页面有很多栏目,增加分栏目的方法如下,这个代码是从mui的列表里抄的

1、在页面内增加样式

 <style>  
        .title{  
            margin: 20px 15px 7px;  
            color: #6d6d72;  
            font-size: 15px;}  

</style>

2、增加分栏目

<div class="title">  
                热卖商品  
            </div>
继续阅读 »

一个页面有很多栏目,增加分栏目的方法如下,这个代码是从mui的列表里抄的

1、在页面内增加样式

 <style>  
        .title{  
            margin: 20px 15px 7px;  
            color: #6d6d72;  
            font-size: 15px;}  

</style>

2、增加分栏目

<div class="title">  
                热卖商品  
            </div>
收起阅读 »

mui在H5和App多端发布开发指南

多端发布

> 注意:推荐使用uni-apphttps://uniapp.dcloud.io/,可以开发一次覆盖iOS、Android、小程序、H5,实现更多端的覆盖。

以下的mui多端覆盖只支持iOS、Android、H5,不支持小程序。


一套代码,实现wap、微信公众号、iOS和Android的App以及流应用,并且保证在App平台上有更好的体验,这对于提升开发效率有巨大的帮助。
实现多端发布,需要处理平台差异,尤其是HTML5+规范扩展的、浏览器并不支持的API,需要兼容降级或动态去除方案。
本文详细讲述了mui的多端发布功能,能做什么,不能做什么,能做的怎么做。

运行环境识别

多端发布首先需要识别在不同的运行环境,有几种判断环境的方式。

  1. UA
    5+app环境下(就是打包为apk或ipa包),ua是包含html5plus字符串的,流应用环境下还会再包含streamapp字符串。普通浏览器里没有这些特殊ua。
  2. plus对象是否存在
    可以在js里判断plus对象是否存在,但需要注意一种情况,如果你的js代码里恰好还定义了一个名为plus的js对象,则这种方法将无法准确判断运行环境。
    所以一般推荐采取UA判断的方式处理。

UI部分的多端发布

mui在所有ui组件上都提供纯HTML实现方案,在HTML效果不佳的ui组件上补充了5+的原生强化。  
mui的窗体切换、父子页面、长列表滚动、下拉刷新、弹出框、ajax,这些功能在5+App环境下可以调用原生api实现增强体验,但在非5+环境下也可以按照普通HTML的做法跑通业务。  
  1. 窗体切换
    mui.openWindow在5+下执行的动画是plus.webview的原生动画,拥有更高的性能。而在非5+环境下执行的是普通网页跳转。
    mui虽然有SPA单页方案,但mui.openWindow并不会在非5+环境下降级为SPA的div窗体切换。
    如果使用spa固然可以一套代码多处使用,但无法在5+环境下自动升级为原生view切换动画。
    官方的推荐是常规页面使用mui.openWindow,只有部分很小的页面使用spa实现,比如设置界面,即原则是div渲染也不会有太大压力的场景才使用spa。
    不了解mui的spa方案的,可以看Hello mui示例的setting模板里,需要单独引入mui.view.js。
  2. 父子页面和长列表滚动
    长div滚动在Android4.4以下很卡。为解决标题固定顶部,下面内容区超长时也可以滚动流畅,5+引入了双webview的父子页面结构,通过webview的body滚动来替代div滚动,以达到原生体验。
    mui的subpages在5+环境下是双webview,而在非5+环境下会自动切为iframe。
    mui虽然也提供了div滚动控件,但适用于局部滚动,比如popover、picker等,subpages并不能在非5+下自动切为div。
  3. 下拉刷新
    基于div的下拉刷新在Android4.4以下也不流畅,5+扩展了原生的下拉刷新控件。
    mui的下拉刷新,在Android的5+ App环境下会调用5+扩展的双webview下拉刷新,而在iOS 的5+环境和非5+环境下,则会调用基于div的下拉刷新。
  4. 弹出框
    mui.alert,mui.confirm,mui.prompt,mui.toast,这些弹出框都是在5+环境下调用nativeUI,而在非5+环境下调用div模拟的框。
    actionsheet控件在Hello mui里提供了原生和div两种方式,目前这两种方式并不能自动切换。
    popover没有原生方式,只有div方式,不存在跨端障碍。
  5. 侧滑菜单
    mui提供了原生和div两种侧滑菜单。
    目前使用了原生侧滑菜单后并不能在非5+环境下自动切换为div模式。
    推荐的做法是把侧滑菜单做简单做小,直接使用div方式的侧滑菜单。
  6. tab选项卡
    mui并没有独立的选项卡控件,而是在Hello mui示例里做了基于原生和div两个不同的选项卡代码示例。
    目前使用了原生侧滑选项卡后并不能在非5+环境下自动切换为div模式。
    从性能角度而言,div选项卡很难承载太多内容,实际使用量也偏少。所以开发者使用了webview的选项卡后,为了实现多端发布,需要在tab的点击事件做判断处理,发现是非5+环境,建议把webview切换改为网页跳转。
  7. ajax
    mui.ajax在5+下为跨域而使用了5+的plus.net的api,而在非5+环境下会自动切换为普通的ajax。
  8. 语音输入控件
    Hello mui的input里有语音输入控件,在HBuilder里敲mspeech回车也给直接生成该控件。在非5+环境下,该控件的麦克风图标不会显示出来,变成普通的输入框。

能力方面的多端发布:plusto互转

除了ui相关,5+还扩展了大量的JS API,这些API有的在手机浏览器或微信浏览器里有类似功能,有的没有。
处理这方面的问题无非两种思路,裁掉或兼容降级。

  1. 对于非5+环境不存在的功能:
    调5+的api前判断下是不是在5+的ua环境下。不是5+环境则不执行plus代码。
  2. 对于可降级的功能:
    定位、拍照、录音、相册功能其实HTML5规范里也有,只是因为体验不佳所以5+进行了扩展。
    处理这类问题又有2种思路:
    2.1 开发者可以在不同的运行环境下引入不同的js,实现这些业务逻辑。比如在浏览器下引入h5camera.js,而在5+下引入pluscamera.js。
    2.2 也可以通过重定义js的方式实现标准化替换。
    DCloud建立了一个开源项目plusto,https://github.com/dcloudio/plusto,这个提供了一个定位转换的例子。
    HTML5写的定位代码,载入示例的js后,该js会自动判断当前的运行环境,发现在5+环境下会重定义HTML5标准的定位对象,改成plus.geolocation对象。
    重定义也有2种做法,一种是使用HTML5的方式写,引入js重定义为plus。一种是使用plus写,然后引入js重新为普通浏览器或微信对象。
    重定义的执行性能低于分条件判断。
    plus.to的开源库还不完整,也欢迎网友积极贡献,提供更多plus、浏览器、微信的互转库文件。

条件编译,加强项目管理,提升执行性能

涉及5+App的js文件,可以独立为单独js,通过条件编译工具在打包时动态引入。
条件编译比运行期动态判断的效率要高,推荐开发者使用。
glup、grunt都是业内成熟的前端构建工具,相关教程本文不介绍,请自行搜索。
DCloud的mui及Hello mui示例是使用grunt构建的,grunt相关配置也都开源在https://github.com/dcloudio/mui
Hello mui作为一个Android、iOS、浏览器里都能使用的多端发布示例,其中同时涉及条件编译、动态UA判断等技术。
mui的plusready或plus的ready事件在非5+环境下不会触发,请把仅在5+环境下才需要的代码写在这些事件里。

write once,run anywhere,这是程序员的梦想,也是生产效率发展的必然方向,让我们一起为之努力。

继续阅读 »

> 注意:推荐使用uni-apphttps://uniapp.dcloud.io/,可以开发一次覆盖iOS、Android、小程序、H5,实现更多端的覆盖。

以下的mui多端覆盖只支持iOS、Android、H5,不支持小程序。


一套代码,实现wap、微信公众号、iOS和Android的App以及流应用,并且保证在App平台上有更好的体验,这对于提升开发效率有巨大的帮助。
实现多端发布,需要处理平台差异,尤其是HTML5+规范扩展的、浏览器并不支持的API,需要兼容降级或动态去除方案。
本文详细讲述了mui的多端发布功能,能做什么,不能做什么,能做的怎么做。

运行环境识别

多端发布首先需要识别在不同的运行环境,有几种判断环境的方式。

  1. UA
    5+app环境下(就是打包为apk或ipa包),ua是包含html5plus字符串的,流应用环境下还会再包含streamapp字符串。普通浏览器里没有这些特殊ua。
  2. plus对象是否存在
    可以在js里判断plus对象是否存在,但需要注意一种情况,如果你的js代码里恰好还定义了一个名为plus的js对象,则这种方法将无法准确判断运行环境。
    所以一般推荐采取UA判断的方式处理。

UI部分的多端发布

mui在所有ui组件上都提供纯HTML实现方案,在HTML效果不佳的ui组件上补充了5+的原生强化。  
mui的窗体切换、父子页面、长列表滚动、下拉刷新、弹出框、ajax,这些功能在5+App环境下可以调用原生api实现增强体验,但在非5+环境下也可以按照普通HTML的做法跑通业务。  
  1. 窗体切换
    mui.openWindow在5+下执行的动画是plus.webview的原生动画,拥有更高的性能。而在非5+环境下执行的是普通网页跳转。
    mui虽然有SPA单页方案,但mui.openWindow并不会在非5+环境下降级为SPA的div窗体切换。
    如果使用spa固然可以一套代码多处使用,但无法在5+环境下自动升级为原生view切换动画。
    官方的推荐是常规页面使用mui.openWindow,只有部分很小的页面使用spa实现,比如设置界面,即原则是div渲染也不会有太大压力的场景才使用spa。
    不了解mui的spa方案的,可以看Hello mui示例的setting模板里,需要单独引入mui.view.js。
  2. 父子页面和长列表滚动
    长div滚动在Android4.4以下很卡。为解决标题固定顶部,下面内容区超长时也可以滚动流畅,5+引入了双webview的父子页面结构,通过webview的body滚动来替代div滚动,以达到原生体验。
    mui的subpages在5+环境下是双webview,而在非5+环境下会自动切为iframe。
    mui虽然也提供了div滚动控件,但适用于局部滚动,比如popover、picker等,subpages并不能在非5+下自动切为div。
  3. 下拉刷新
    基于div的下拉刷新在Android4.4以下也不流畅,5+扩展了原生的下拉刷新控件。
    mui的下拉刷新,在Android的5+ App环境下会调用5+扩展的双webview下拉刷新,而在iOS 的5+环境和非5+环境下,则会调用基于div的下拉刷新。
  4. 弹出框
    mui.alert,mui.confirm,mui.prompt,mui.toast,这些弹出框都是在5+环境下调用nativeUI,而在非5+环境下调用div模拟的框。
    actionsheet控件在Hello mui里提供了原生和div两种方式,目前这两种方式并不能自动切换。
    popover没有原生方式,只有div方式,不存在跨端障碍。
  5. 侧滑菜单
    mui提供了原生和div两种侧滑菜单。
    目前使用了原生侧滑菜单后并不能在非5+环境下自动切换为div模式。
    推荐的做法是把侧滑菜单做简单做小,直接使用div方式的侧滑菜单。
  6. tab选项卡
    mui并没有独立的选项卡控件,而是在Hello mui示例里做了基于原生和div两个不同的选项卡代码示例。
    目前使用了原生侧滑选项卡后并不能在非5+环境下自动切换为div模式。
    从性能角度而言,div选项卡很难承载太多内容,实际使用量也偏少。所以开发者使用了webview的选项卡后,为了实现多端发布,需要在tab的点击事件做判断处理,发现是非5+环境,建议把webview切换改为网页跳转。
  7. ajax
    mui.ajax在5+下为跨域而使用了5+的plus.net的api,而在非5+环境下会自动切换为普通的ajax。
  8. 语音输入控件
    Hello mui的input里有语音输入控件,在HBuilder里敲mspeech回车也给直接生成该控件。在非5+环境下,该控件的麦克风图标不会显示出来,变成普通的输入框。

能力方面的多端发布:plusto互转

除了ui相关,5+还扩展了大量的JS API,这些API有的在手机浏览器或微信浏览器里有类似功能,有的没有。
处理这方面的问题无非两种思路,裁掉或兼容降级。

  1. 对于非5+环境不存在的功能:
    调5+的api前判断下是不是在5+的ua环境下。不是5+环境则不执行plus代码。
  2. 对于可降级的功能:
    定位、拍照、录音、相册功能其实HTML5规范里也有,只是因为体验不佳所以5+进行了扩展。
    处理这类问题又有2种思路:
    2.1 开发者可以在不同的运行环境下引入不同的js,实现这些业务逻辑。比如在浏览器下引入h5camera.js,而在5+下引入pluscamera.js。
    2.2 也可以通过重定义js的方式实现标准化替换。
    DCloud建立了一个开源项目plusto,https://github.com/dcloudio/plusto,这个提供了一个定位转换的例子。
    HTML5写的定位代码,载入示例的js后,该js会自动判断当前的运行环境,发现在5+环境下会重定义HTML5标准的定位对象,改成plus.geolocation对象。
    重定义也有2种做法,一种是使用HTML5的方式写,引入js重定义为plus。一种是使用plus写,然后引入js重新为普通浏览器或微信对象。
    重定义的执行性能低于分条件判断。
    plus.to的开源库还不完整,也欢迎网友积极贡献,提供更多plus、浏览器、微信的互转库文件。

条件编译,加强项目管理,提升执行性能

涉及5+App的js文件,可以独立为单独js,通过条件编译工具在打包时动态引入。
条件编译比运行期动态判断的效率要高,推荐开发者使用。
glup、grunt都是业内成熟的前端构建工具,相关教程本文不介绍,请自行搜索。
DCloud的mui及Hello mui示例是使用grunt构建的,grunt相关配置也都开源在https://github.com/dcloudio/mui
Hello mui作为一个Android、iOS、浏览器里都能使用的多端发布示例,其中同时涉及条件编译、动态UA判断等技术。
mui的plusready或plus的ready事件在非5+环境下不会触发,请把仅在5+环境下才需要的代码写在这些事件里。

write once,run anywhere,这是程序员的梦想,也是生产效率发展的必然方向,让我们一起为之努力。

收起阅读 »

mui.fire 在安卓 4.3机器上没有执行

mui.fire(webview, 'start');  

// 在 另外一个 webview 下的代码  
function start() {  
    console.log('start 并没有进入这里')  
}  
window.addEventListener('start', start);

涉及机型
红米
以及三星 note3

function plusReady ( cb ) {  
    if( window.plus && window.plus.isReady ) {  
      setTimeout(function (){  
        cb()  
      },200);  
    } else {  
      document.addEventListener('plusready', function () {  
        setTimeout(function (){  
            cb()  
        },200);  
      },false);  
    }      
}  
//页面1  
;(function(){  
    plusReady(function () {  
        var view = plus.create(....); // 页面2  

        view.onloaded = function () {  
            mui.fire(view, 'start')  
        }  
    });  
})();  
// 页面2  
;(function(){  
    plusReady(function () {  
        window.addEventListener('start', start);  
        function start() {  
            console.log('start 并没有进入这里')  
        }   
    });  
})();
继续阅读 »
mui.fire(webview, 'start');  

// 在 另外一个 webview 下的代码  
function start() {  
    console.log('start 并没有进入这里')  
}  
window.addEventListener('start', start);

涉及机型
红米
以及三星 note3

function plusReady ( cb ) {  
    if( window.plus && window.plus.isReady ) {  
      setTimeout(function (){  
        cb()  
      },200);  
    } else {  
      document.addEventListener('plusready', function () {  
        setTimeout(function (){  
            cb()  
        },200);  
      },false);  
    }      
}  
//页面1  
;(function(){  
    plusReady(function () {  
        var view = plus.create(....); // 页面2  

        view.onloaded = function () {  
            mui.fire(view, 'start')  
        }  
    });  
})();  
// 页面2  
;(function(){  
    plusReady(function () {  
        window.addEventListener('start', start);  
        function start() {  
            console.log('start 并没有进入这里')  
        }   
    });  
})();
收起阅读 »

打开带背景音乐的H5页面,程序退到后台的时候,音乐还在播放.

打开带背景音乐的H5页面,程序退到后台的时候,音乐还在播放.用微信打开就没这个问题?webview应该怎样设置?

打开带背景音乐的H5页面,程序退到后台的时候,音乐还在播放.用微信打开就没这个问题?webview应该怎样设置?

mui.dtpicker.js增加不出现未来日期的功能

最近使用mui的日期选择器,有个问题是,未来的日期也会出现,未来避免这个问题,在mui.dtpicker.js中增加了一点点代码,在配置项 option.endTimeIsNow = true 的时候开启不显示未来日期的功能。
控件初始化示例如下:

        var now = new Date();  
        var datePicke = new mui.DtPicker({  
            "type": "datetime",  
            "beginYear": 2016,  
            "endYear": now.getFullYear(),  
            "value": aFunc._getNowDateText(),  
            "endTimeIsNow": true  
        });

改造后的mui.dtpicker.js见附件。

继续阅读 »

最近使用mui的日期选择器,有个问题是,未来的日期也会出现,未来避免这个问题,在mui.dtpicker.js中增加了一点点代码,在配置项 option.endTimeIsNow = true 的时候开启不显示未来日期的功能。
控件初始化示例如下:

        var now = new Date();  
        var datePicke = new mui.DtPicker({  
            "type": "datetime",  
            "beginYear": 2016,  
            "endYear": now.getFullYear(),  
            "value": aFunc._getNowDateText(),  
            "endTimeIsNow": true  
        });

改造后的mui.dtpicker.js见附件。

收起阅读 »