HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

为何那么多一线互联网公司做流应用?

流应用

流应用是一个很多人不太容易理解的新概念,从去年大众点评外卖流应用上线时,很多人就不理解:

  1. 大众点评有原生版,为何又单独立项做流应用?成本增加了啊;
  2. 为何要做一个只能在360手助发行的版本?获取用户的潜在基数小了啊。

流应用接下来的发展就让人“更难理解”了,京东、360、有道、唯品会、携程、去哪儿、途牛、驴妈妈、神州专车、蘑菇街、当当、e代驾、卖座电影、爱鲜蜂…这些一线互联网公司怎么都在做流应用?
连做游戏的也进来了,传奇世界流应用也上线了,DCloud并没有专用游戏引擎,他们干啥呢?

其实不止是这些厂家,按目前的业务发展速度,预计年内主流的互联网App大多都会有流应用版本。

有人怀疑难道360手助强压开发商做流应用?然后由DCloud为其外包开发?
当然也不是,大家做流应用都是自愿投人投钱做,有的公司的流应用团队还不小,市场、产品、技术、运营、测试组成十几人的团队负责流应用项目。

可是流应用到底有什么魅力把这些大公司们纷纷卷进来呢?
还有,DCloud一直说面向开发者免费,工具免费、自己也不接项目开发,它怎么挣钱,它到底想干啥?
这个问题这几年一直被人问,现在也该解释了。

开发者做App,目的不是“做App”,而是给移动互联网用户提供服务。
如何获取用户、获得订单、持续复购或持续看广告?这是更根本的问题。
DCloud给开发者提供的,是一个基于HTML5的、从开发到获取用户到持续商业变现的全流程闭环生态。
并且是一个获客成本、用户质量、运营指标比原生生态更优质的新生态。
具体来讲,

  1. 获客成本低
    一个原生app的下载成本几元、激活成本十几元,新客几十元。而流应用可以把这个成本下降数倍。
  2. 获客质量不变
    流应用因为能达到原生的功能和体验,其留存、注册转换、订单转换、复购率等各项指标与原生app并无差别。DCloud为流应用开发者提供了专业的运营报表分析系统,可协助开发者优化各项业务指标。
  3. 获客数量多
    为什么流应用目前只有360手助上能搜索到,就能有足够多用户量来满足一线互联网公司的胃口?
    因为流应用的主流获取方式,并不是以前人们理解那种在应用市场搜索点击下载的方式。
    流应用有5种获取方式,push、wap导量、应用市场内点击、快码扫描、社交推广(这里有各种方式的视频可以看)。在这些获客方式里,传统的应用市场搜索点击的方式并不是主流量来源。
    2016年春节,DCloud为某电影票流应用厂商做push推广,发送《美人鱼》特价电影票,一次push获取了8万用户。获客效率之高是原生App推广不可比拟的。
    4月19日唯品会周年大促,也委托DCloud进行流应用push推广。因为在流应用引擎覆盖的几亿用户中,即使是一线互联网公司,其App装机占比超过20%也是寥寥无几,大量空白的用户市场需要占领挖掘。
    除了拉新,提升原有流量质量也是开发商很关心的事情。秒开、wap导量、快码等流应用发行方式能把开发商原来的低效的线上线下流量的效率提升数倍,这都是非常吸引开发商的地方。

虽然流应用好处多多,但总结这几条就够App开发商重视了。获客量大、获客成本低、获客后的运营数据指标好,大公司又不缺人,为什么不做流应用呢?
而且大公司的很多前端本身也是Hbuilder的用户,上手开发很快。

这就是大公司们纷纷做流应用的基础逻辑,很多人没想到,但说穿了也不难理解。
当然流应用不是大公司们的专属产品,创业公司一样非常需要。
创业公司的App受众面一般较窄,服务特定人群,在应用市场打广告推广是不可行的。
如何找到定向用户群,这也是流应用的重要价值。
DCloud在流应用推广中是可以定向推广的,学生、车主、球迷、女性甚至孕妇…流应用能提前根据用户画像特征更有效的对接用户和开发商的需求。

说到这儿大部分人就明白了,DCloud的变现不是通过做开发服务,而是通过发行变现。
有人还以为DCloud最近在帮各大厂商开发流应用进行收费,不是的,DCloud真的不挣开发费。
DCloud公司从成立就不是为了制作和销售App开发工具,而是为了推动HTML5的发展,重构移动互联网目前原生为主的产业生态。
左边,我们让开发者可以降低开发成本、提升获客效率;
右边,我们让手机用户省流量省空间省电,方便的获取更多优质应用服务。
DCloud不但不挣开发方面的钱,还努力给开发者免费提供比商业产品还优秀的开发工具,是希望开发者们可以制造出丰富、优质的基于HTML5的移动互联网内容。
但是不要误会发布流应用就收费,发布流应用到应用市场是免费的,只是当你计划投资推广App时,DCloud是最佳投放partner。
就像你做网站是不用给google付费的,但想推广网站就会发现google最靠谱。当然google在互联网初期并没有提供开发工具和浏览器,但这些事DCloud都做了。

08年时,人们想不到5年后的移动互联网竟然发展成这个样子。
未来也一样,HTML5重构的移动互联网生态和现在不一样,这里面有太多新机会。
对于外包商而言,他们可以做DCloud的代理,给他们的雇主提供从开发到发行的全套服务,甚至有些外包商已经给雇主免费做app但每个激活用户收取xx元。
对于工程师,流应用是一个很酷的新技能,很多大公司都需要熟悉流应用的高级开发者,值得大家花时间学习。我们有很多广告主有外包开发需求,DCloud并不接包,也可以引荐优秀的开发者接外包。

不知不觉中,各位也将见证中国发生世界级的革新。不过流应用毕竟太新,当前也还存在各种问题,希望大家一起支持流应用的发展。
大家可能还有很多疑问,欢迎到流应用QQ群交流471285299。

备注:

  1. 有开发者担心DCloud大力发展流应用会影响开发工具产品进步。
    这个不但不会,反而在众多一线互联网公司的严苛要求下,DCloud的产品体验越来越好、细节越来越完善。
  2. 有开发者不清楚DCloud的流应用上亿引擎覆盖率是怎么来的,担心自己打包成apk、ipa的变成流应用的引擎。
    不是这样的。DCloud的流应用引擎是独立的,不能内嵌在开发者的app里,其装机量和数据来源主要来自合作的应用市场。开发者打包的原生安装包并没有流应用引擎。有开发者提出想在apk里内嵌流应用引擎怎么办,后续DCloud会推出将允许开发者内嵌流应用引擎到app里的版本。
继续阅读 »

流应用是一个很多人不太容易理解的新概念,从去年大众点评外卖流应用上线时,很多人就不理解:

  1. 大众点评有原生版,为何又单独立项做流应用?成本增加了啊;
  2. 为何要做一个只能在360手助发行的版本?获取用户的潜在基数小了啊。

流应用接下来的发展就让人“更难理解”了,京东、360、有道、唯品会、携程、去哪儿、途牛、驴妈妈、神州专车、蘑菇街、当当、e代驾、卖座电影、爱鲜蜂…这些一线互联网公司怎么都在做流应用?
连做游戏的也进来了,传奇世界流应用也上线了,DCloud并没有专用游戏引擎,他们干啥呢?

其实不止是这些厂家,按目前的业务发展速度,预计年内主流的互联网App大多都会有流应用版本。

有人怀疑难道360手助强压开发商做流应用?然后由DCloud为其外包开发?
当然也不是,大家做流应用都是自愿投人投钱做,有的公司的流应用团队还不小,市场、产品、技术、运营、测试组成十几人的团队负责流应用项目。

可是流应用到底有什么魅力把这些大公司们纷纷卷进来呢?
还有,DCloud一直说面向开发者免费,工具免费、自己也不接项目开发,它怎么挣钱,它到底想干啥?
这个问题这几年一直被人问,现在也该解释了。

开发者做App,目的不是“做App”,而是给移动互联网用户提供服务。
如何获取用户、获得订单、持续复购或持续看广告?这是更根本的问题。
DCloud给开发者提供的,是一个基于HTML5的、从开发到获取用户到持续商业变现的全流程闭环生态。
并且是一个获客成本、用户质量、运营指标比原生生态更优质的新生态。
具体来讲,

  1. 获客成本低
    一个原生app的下载成本几元、激活成本十几元,新客几十元。而流应用可以把这个成本下降数倍。
  2. 获客质量不变
    流应用因为能达到原生的功能和体验,其留存、注册转换、订单转换、复购率等各项指标与原生app并无差别。DCloud为流应用开发者提供了专业的运营报表分析系统,可协助开发者优化各项业务指标。
  3. 获客数量多
    为什么流应用目前只有360手助上能搜索到,就能有足够多用户量来满足一线互联网公司的胃口?
    因为流应用的主流获取方式,并不是以前人们理解那种在应用市场搜索点击下载的方式。
    流应用有5种获取方式,push、wap导量、应用市场内点击、快码扫描、社交推广(这里有各种方式的视频可以看)。在这些获客方式里,传统的应用市场搜索点击的方式并不是主流量来源。
    2016年春节,DCloud为某电影票流应用厂商做push推广,发送《美人鱼》特价电影票,一次push获取了8万用户。获客效率之高是原生App推广不可比拟的。
    4月19日唯品会周年大促,也委托DCloud进行流应用push推广。因为在流应用引擎覆盖的几亿用户中,即使是一线互联网公司,其App装机占比超过20%也是寥寥无几,大量空白的用户市场需要占领挖掘。
    除了拉新,提升原有流量质量也是开发商很关心的事情。秒开、wap导量、快码等流应用发行方式能把开发商原来的低效的线上线下流量的效率提升数倍,这都是非常吸引开发商的地方。

虽然流应用好处多多,但总结这几条就够App开发商重视了。获客量大、获客成本低、获客后的运营数据指标好,大公司又不缺人,为什么不做流应用呢?
而且大公司的很多前端本身也是Hbuilder的用户,上手开发很快。

这就是大公司们纷纷做流应用的基础逻辑,很多人没想到,但说穿了也不难理解。
当然流应用不是大公司们的专属产品,创业公司一样非常需要。
创业公司的App受众面一般较窄,服务特定人群,在应用市场打广告推广是不可行的。
如何找到定向用户群,这也是流应用的重要价值。
DCloud在流应用推广中是可以定向推广的,学生、车主、球迷、女性甚至孕妇…流应用能提前根据用户画像特征更有效的对接用户和开发商的需求。

说到这儿大部分人就明白了,DCloud的变现不是通过做开发服务,而是通过发行变现。
有人还以为DCloud最近在帮各大厂商开发流应用进行收费,不是的,DCloud真的不挣开发费。
DCloud公司从成立就不是为了制作和销售App开发工具,而是为了推动HTML5的发展,重构移动互联网目前原生为主的产业生态。
左边,我们让开发者可以降低开发成本、提升获客效率;
右边,我们让手机用户省流量省空间省电,方便的获取更多优质应用服务。
DCloud不但不挣开发方面的钱,还努力给开发者免费提供比商业产品还优秀的开发工具,是希望开发者们可以制造出丰富、优质的基于HTML5的移动互联网内容。
但是不要误会发布流应用就收费,发布流应用到应用市场是免费的,只是当你计划投资推广App时,DCloud是最佳投放partner。
就像你做网站是不用给google付费的,但想推广网站就会发现google最靠谱。当然google在互联网初期并没有提供开发工具和浏览器,但这些事DCloud都做了。

08年时,人们想不到5年后的移动互联网竟然发展成这个样子。
未来也一样,HTML5重构的移动互联网生态和现在不一样,这里面有太多新机会。
对于外包商而言,他们可以做DCloud的代理,给他们的雇主提供从开发到发行的全套服务,甚至有些外包商已经给雇主免费做app但每个激活用户收取xx元。
对于工程师,流应用是一个很酷的新技能,很多大公司都需要熟悉流应用的高级开发者,值得大家花时间学习。我们有很多广告主有外包开发需求,DCloud并不接包,也可以引荐优秀的开发者接外包。

不知不觉中,各位也将见证中国发生世界级的革新。不过流应用毕竟太新,当前也还存在各种问题,希望大家一起支持流应用的发展。
大家可能还有很多疑问,欢迎到流应用QQ群交流471285299。

备注:

  1. 有开发者担心DCloud大力发展流应用会影响开发工具产品进步。
    这个不但不会,反而在众多一线互联网公司的严苛要求下,DCloud的产品体验越来越好、细节越来越完善。
  2. 有开发者不清楚DCloud的流应用上亿引擎覆盖率是怎么来的,担心自己打包成apk、ipa的变成流应用的引擎。
    不是这样的。DCloud的流应用引擎是独立的,不能内嵌在开发者的app里,其装机量和数据来源主要来自合作的应用市场。开发者打包的原生安装包并没有流应用引擎。有开发者提出想在apk里内嵌流应用引擎怎么办,后续DCloud会推出将允许开发者内嵌流应用引擎到app里的版本。
收起阅读 »

HBuilder中文输入法免干扰功能说明

代码助手

HBuilder7.1起支持中文符合自动替换为英文符合。
中文符号免干扰指在编写html、js、css代码时,如果处于中文输入法状态,自动将必要的符号如:;。等转为: ; .等。
如下图:
①在HTML区域输入《

②在js区域输入。


③在css 输入 》

如你不需要此功能,请在工具-选项-HBuilder-编辑器的对应html、js、css、json编辑器类型中调整
如下图:

A处开关勾选后,开启HTML文件中文免干扰功能,B处是要转义的中文字符

继续阅读 »

HBuilder7.1起支持中文符合自动替换为英文符合。
中文符号免干扰指在编写html、js、css代码时,如果处于中文输入法状态,自动将必要的符号如:;。等转为: ; .等。
如下图:
①在HTML区域输入《

②在js区域输入。


③在css 输入 》

如你不需要此功能,请在工具-选项-HBuilder-编辑器的对应html、js、css、json编辑器类型中调整
如下图:

A处开关勾选后,开启HTML文件中文免干扰功能,B处是要转义的中文字符

收起阅读 »

下拉刷新后, 如何定位到某一位置呢

下拉刷新

下拉刷新后, 如何定位到某一位置呢

下拉刷新后, 如何定位到某一位置呢

XHRHTTPREQUEST的一个坑

ajax

我使用xhrhttprequest发送POST请求,按照官网说得在调用send方法的时候传送data参数,后台死活取不到值,后面测试一看才知道传送的data参数是在作为body数据传送过去,后台接收的post参数为空,raw参数才是我们传送的值
后来改为mui.ajax就没问题了.....
特记录在这里,免得大家入坑

继续阅读 »

我使用xhrhttprequest发送POST请求,按照官网说得在调用send方法的时候传送data参数,后台死活取不到值,后面测试一看才知道传送的data参数是在作为body数据传送过去,后台接收的post参数为空,raw参数才是我们传送的值
后来改为mui.ajax就没问题了.....
特记录在这里,免得大家入坑

收起阅读 »

关于二级页面返回后刷新一级页面的实践

返回刷新 mui

var taskList = plus.webview.getWebviewById('tasklist');
taskList.reload();
mui.back();

1、上面是我根据官方的提示方法,以及问答社区朋友的回答,得到的返回刷新页面的方法。

2、具体实现方法是,把以上代码放到触发返回刷新事件的元素上

document.getElementById("btn").addEventListener("tap", function() {  
       var taskList = plus.webview.getWebviewById('tasklist');  
       taskList.reload();  
       mui.back();  
}

3、getWebviewById('tasklist');中的tasklist即为要刷新的页面的id,但是这个id从何而来呢?

4、其实除了入口页面,其他页面都是可以通过openwindow的时候追加id的,也就是说是通过要刷新的页面的上一个页面得来。

mui.openWindow({  
        url: 'my-task-list.html',  
        id: 'tasklist',  
}

5、我在处理返回刷新的时候在getWebviewById这里卡了很久,记录下来,以备查阅。

继续阅读 »

var taskList = plus.webview.getWebviewById('tasklist');
taskList.reload();
mui.back();

1、上面是我根据官方的提示方法,以及问答社区朋友的回答,得到的返回刷新页面的方法。

2、具体实现方法是,把以上代码放到触发返回刷新事件的元素上

document.getElementById("btn").addEventListener("tap", function() {  
       var taskList = plus.webview.getWebviewById('tasklist');  
       taskList.reload();  
       mui.back();  
}

3、getWebviewById('tasklist');中的tasklist即为要刷新的页面的id,但是这个id从何而来呢?

4、其实除了入口页面,其他页面都是可以通过openwindow的时候追加id的,也就是说是通过要刷新的页面的上一个页面得来。

mui.openWindow({  
        url: 'my-task-list.html',  
        id: 'tasklist',  
}

5、我在处理返回刷新的时候在getWebviewById这里卡了很久,记录下来,以备查阅。

收起阅读 »

每日一课 跨平台APP开发精品公开课

mui HBuilder

腾讯课堂专业IT培训,每天都有免费公开课,想学习的同学们来听课,可以收藏课表,HTML+CSS课程,JavaScript课程,跨平台APP开发课程,全天三个时间段免费直播,老师在线交流, 马上学习 >>>跨平台app开发精品课

继续阅读 »

腾讯课堂专业IT培训,每天都有免费公开课,想学习的同学们来听课,可以收藏课表,HTML+CSS课程,JavaScript课程,跨平台APP开发课程,全天三个时间段免费直播,老师在线交流, 马上学习 >>>跨平台app开发精品课

收起阅读 »

ajax像jq一样通过表单序列化方式提交表单

mui

      mui.ajax('url', {  
            data: $("#form").serialize(),  
            dataType: 'json',  
            type: 'post',  
            timeout: 10000,  
            success: function(data) {  
                //成功的操作  
            },  
            error: function(xhr, type, errorThrown) {  
                //失败的操作  
            }  
      });  

没错,就是设置data的值为$("#form").serialize(),不过这样要引入jquery,好像官方不太建议直接引入jq,不知道有没有更好的方法去序列化一个表单

继续阅读 »

      mui.ajax('url', {  
            data: $("#form").serialize(),  
            dataType: 'json',  
            type: 'post',  
            timeout: 10000,  
            success: function(data) {  
                //成功的操作  
            },  
            error: function(xhr, type, errorThrown) {  
                //失败的操作  
            }  
      });  

没错,就是设置data的值为$("#form").serialize(),不过这样要引入jquery,好像官方不太建议直接引入jq,不知道有没有更好的方法去序列化一个表单

收起阅读 »

闹铃提醒

Broadcast Native.JS 广播

项目需要,做了一个闹铃提醒的例子。


<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title>TTimer</title>  
        <script src="js/mui.min.js"></script>  
        <link href="http://ask.dcloud.net.cn/css/mui.min.css" rel="stylesheet" />  
    </head>  

    <body style="padding: 40px;">  
        <button id="alarm"> 插入闹铃</button>  
    </body>  
    <script type="text/javascript" charset="utf-8">  
        mui.init();  
        mui.plusReady(function() {  
            //  
            mui("body").on('tap', 'button', function(event) {  
                var id = this.getAttribute('id');  
                if (id == "alarm") {  
                    addAlarm();  
                }  
            });  
            var main = plus.android.runtimeMainActivity();  
            // 广播接收  
            var ALARM_RECEIVER = "alarm_receiver";  
            var receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {  
                onReceive: function(context, intent) { //实现onReceiver回调函数  
                    plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
                    //console.log(intent.getAction()); //获取action  
                    var txt = "接收到消息"   intent.getAction()   ": "   getCurTime();  
                    mui.toast(txt);  
                    pushMsg(txt);  
                    main.unregisterReceiver(receiver); //取消监听  
                }  
            });  
            //  
            function addAlarm() {  
                // --- 注册监听 start ---  
                var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
                var filter = new IntentFilter(ALARM_RECEIVER);  
                main.registerReceiver(receiver, filter);  
                // --- 注册监听 end ---  
                // --- 设置闹铃时间 start ---  
                var Calendar = plus.android.importClass('java.util.Calendar');  
                var calendar = Calendar.getInstance();  
                // 11点4分执行  
                //calendar.set(Calendar.HOUR_OF_DAY, 11);  
                //calendar.set(Calendar.MINUTE, 4);  
                //calendar.set(Calendar.SECOND, 0);  
                // 过5s 执行  
                calendar.setTimeInMillis(Date.parse(new Date()));  
                calendar.add(Calendar.SECOND, 5);  
                // --- 设置闹铃时间 end ---  
                // --- 设置闹铃 ---  
                var Intent = plus.android.importClass('android.content.Intent');  
                var intent = new Intent(ALARM_RECEIVER);  
                //  
                var PendingIntent = plus.android.importClass('android.app.PendingIntent');  
                var sender = PendingIntent.getBroadcast(main, 0, intent, 0);  
                //  
                var AlarmManager = plus.android.importClass("android.app.AlarmManager");  
                var Context = plus.android.importClass("android.content.Context");  
                var alarm = main.getSystemService(Context.ALARM_SERVICE);  
                // 一次    
                alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);  
                // 重复多次  
                //alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5 * 1000, sender);  
                mui.toast("设置闹铃5秒后提醒: "   getCurTime());  
            };  
            //  
            function pushMsg(content) {  
                var options = {  
                    "title": "闹铃提醒",  
                };  
                plus.push.createMessage(content, "alarm", options);  
            };  
            //  
            function getCurTime() {  
                var d = new Date();  
                return d.getFullYear()   "-"   (d.getMonth()   1)   "-"   d.getDate()   " "   d.getHours()   ":"   d.getMinutes()   ":"   d.getSeconds();  
            };  
        });  
    </script>  

</html>  
继续阅读 »

项目需要,做了一个闹铃提醒的例子。


<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title>TTimer</title>  
        <script src="js/mui.min.js"></script>  
        <link href="http://ask.dcloud.net.cn/css/mui.min.css" rel="stylesheet" />  
    </head>  

    <body style="padding: 40px;">  
        <button id="alarm"> 插入闹铃</button>  
    </body>  
    <script type="text/javascript" charset="utf-8">  
        mui.init();  
        mui.plusReady(function() {  
            //  
            mui("body").on('tap', 'button', function(event) {  
                var id = this.getAttribute('id');  
                if (id == "alarm") {  
                    addAlarm();  
                }  
            });  
            var main = plus.android.runtimeMainActivity();  
            // 广播接收  
            var ALARM_RECEIVER = "alarm_receiver";  
            var receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {  
                onReceive: function(context, intent) { //实现onReceiver回调函数  
                    plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
                    //console.log(intent.getAction()); //获取action  
                    var txt = "接收到消息"   intent.getAction()   ": "   getCurTime();  
                    mui.toast(txt);  
                    pushMsg(txt);  
                    main.unregisterReceiver(receiver); //取消监听  
                }  
            });  
            //  
            function addAlarm() {  
                // --- 注册监听 start ---  
                var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
                var filter = new IntentFilter(ALARM_RECEIVER);  
                main.registerReceiver(receiver, filter);  
                // --- 注册监听 end ---  
                // --- 设置闹铃时间 start ---  
                var Calendar = plus.android.importClass('java.util.Calendar');  
                var calendar = Calendar.getInstance();  
                // 11点4分执行  
                //calendar.set(Calendar.HOUR_OF_DAY, 11);  
                //calendar.set(Calendar.MINUTE, 4);  
                //calendar.set(Calendar.SECOND, 0);  
                // 过5s 执行  
                calendar.setTimeInMillis(Date.parse(new Date()));  
                calendar.add(Calendar.SECOND, 5);  
                // --- 设置闹铃时间 end ---  
                // --- 设置闹铃 ---  
                var Intent = plus.android.importClass('android.content.Intent');  
                var intent = new Intent(ALARM_RECEIVER);  
                //  
                var PendingIntent = plus.android.importClass('android.app.PendingIntent');  
                var sender = PendingIntent.getBroadcast(main, 0, intent, 0);  
                //  
                var AlarmManager = plus.android.importClass("android.app.AlarmManager");  
                var Context = plus.android.importClass("android.content.Context");  
                var alarm = main.getSystemService(Context.ALARM_SERVICE);  
                // 一次    
                alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);  
                // 重复多次  
                //alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5 * 1000, sender);  
                mui.toast("设置闹铃5秒后提醒: "   getCurTime());  
            };  
            //  
            function pushMsg(content) {  
                var options = {  
                    "title": "闹铃提醒",  
                };  
                plus.push.createMessage(content, "alarm", options);  
            };  
            //  
            function getCurTime() {  
                var d = new Date();  
                return d.getFullYear()   "-"   (d.getMonth()   1)   "-"   d.getDate()   " "   d.getHours()   ":"   d.getMinutes()   ":"   d.getSeconds();  
            };  
        });  
    </script>  

</html>  
收起阅读 »

只要是Hbuilder大牛,就宠定你了!

国家软件创业实训中心孵化企业--上海比冲信息科技有限公司诚招Hbuilder工程师
工作地点:上海杨浦区五角场
待遇:6-12K
要求:至少1年Hbuilder开发经验或至少完成1个APP
霸气女王邀你入伙,一同寻宝!
点燃他们(球迷、彩迷)的荷尔蒙!

作品和简历请发到这里:ling.fu@foodietech.cn

继续阅读 »

国家软件创业实训中心孵化企业--上海比冲信息科技有限公司诚招Hbuilder工程师
工作地点:上海杨浦区五角场
待遇:6-12K
要求:至少1年Hbuilder开发经验或至少完成1个APP
霸气女王邀你入伙,一同寻宝!
点燃他们(球迷、彩迷)的荷尔蒙!

作品和简历请发到这里:ling.fu@foodietech.cn

收起阅读 »

关于HBuilder弹出“请查看...log文件”启动不了的解决办法。

启动

我在win10下面使用的HBuilder 7.0.0版本。
之前没觉得HB有什么不爽的,除了启动的时候有一丝丝慢的温柔感,但还是可以忍的。

直到刚才上班开电脑后启动HB时弹出“请查看xxxlog文件”时我就蒙毙了。

打开HB官网后发现有这个交流社区,搜索“HBuilder启动不了”后弹出好多贴,料到很多大小猿也遇到了这个问题。

看了几篇也没发现有什么好的解决方案。不过有一个网友提到了注册表,让我醍醐灌顶。

首先,启动不了时我第一选择是删除再解压原来的安装包,然并卵;
然后,更换安装根目录(原先在D盘,剪切至E盘),然并卵。
最后,愤然打开"WIN+R",输入“regedit”,进入注册表窗口,接着就兴高采烈的搜索“HBuilder”删除相应注册表条目,直至搜索不出来。

删完注册表,去茶水间倒杯咖啡,闻了一下,回到座位上打开HB的安装目录尝试再次启动。

OK,输入帐号密码,登录成功!!

不废话了,有这种情况的朋友赶紧跑注册表里倒腾去吧!

以上是我个人遇到的情况与解决方法,采纳前请慎重考虑。


建议工程根目录不要放在HB的安装目录,HB丢了不要紧再装一个,但你的工程丢了如果没有备份就该喊娘了!

个人网站:http://www.ipic.so

继续阅读 »

我在win10下面使用的HBuilder 7.0.0版本。
之前没觉得HB有什么不爽的,除了启动的时候有一丝丝慢的温柔感,但还是可以忍的。

直到刚才上班开电脑后启动HB时弹出“请查看xxxlog文件”时我就蒙毙了。

打开HB官网后发现有这个交流社区,搜索“HBuilder启动不了”后弹出好多贴,料到很多大小猿也遇到了这个问题。

看了几篇也没发现有什么好的解决方案。不过有一个网友提到了注册表,让我醍醐灌顶。

首先,启动不了时我第一选择是删除再解压原来的安装包,然并卵;
然后,更换安装根目录(原先在D盘,剪切至E盘),然并卵。
最后,愤然打开"WIN+R",输入“regedit”,进入注册表窗口,接着就兴高采烈的搜索“HBuilder”删除相应注册表条目,直至搜索不出来。

删完注册表,去茶水间倒杯咖啡,闻了一下,回到座位上打开HB的安装目录尝试再次启动。

OK,输入帐号密码,登录成功!!

不废话了,有这种情况的朋友赶紧跑注册表里倒腾去吧!

以上是我个人遇到的情况与解决方法,采纳前请慎重考虑。


建议工程根目录不要放在HB的安装目录,HB丢了不要紧再装一个,但你的工程丢了如果没有备份就该喊娘了!

个人网站:http://www.ipic.so

收起阅读 »

H5游戏改造流应用指南

游戏

传统的H5游戏,只能在浏览器里发行,不能在应用市场发行,也无法自动在桌面留有图标。
这样的H5游戏,体验不足,留存上不去。

流应用不是在浏览器里发行,而是在应用市场发行,在桌面天然有图标,但却也拥有即点即开的特性。
并且运行在流应用里,可以调用操作系统底层的40w api,可实现强大的功能。

下图为在360手机助手搜索传奇世界,可看到流应用的秒开按钮。

流应用为H5游戏提供了什么?

  1. 更高效的发行平台和留存率提升
    通过DCloud与应用市场的合作,流应用可发行到应用市场里,并基于DCloud的流式发行技术实现秒开,过去App下载、安装、启动这3步被合为一步。
    并且自动在桌面留存图标,不像浏览器那样是需要用户操作后才能创建到桌面上。这切实提高了留存率。
  2. 联合登陆-提升注册转化率
    通过流应用提供的联合登陆机制,可直接完成注册,避免用户注册账户的麻烦,白名单合作厂商还可以直接拿到手机号。
    这个机制可以切实提高注册转化率。
    以传奇世界H5的运行数据为例,流应用版的角色创建率比各版平均值提升75%。
  3. 原生支付控件-提升支付成功率
    在流应用平台里可以直接调起支付宝原生支付控件,如果开发商有微信wap支付权限,也可以直接在流应用里使用。
    通过更优秀的体验,可以提高支付成功率。
    以传奇世界H5的运行数据为例,流应用版的付费率比各版平均值提升100%,付费成功率提升50%。
  4. 社交分享-提升二次传播率
    流应用提供的社交分享能力,可以调起原生的微信、微博、qq、短信、邮件等各种社交分享通道,方便的邀请好友和传播。
    分享出去的链接别人点击后,如果手机上有流应用引擎,则会直接秒装好该游戏的流应用并进入特定界面,如果对方手机上没有流应用引擎则出现标准HTML5版本。
    注:流应用引擎的装机覆盖量过亿,目前测试数据是每3个Android设备就有一个能命中。
    通过流应用的分享机制,可以切实提高二次传播率。
  5. 更多操作系统的原生API
    事实上除了上面常用的增强API,流应用提供了原生操作系统40万API的调用能力,完全可以在流应用里随意调用原生API。
    开发者可以充分发挥想象力,摇一摇、扫一扫、原生定位、读取imei、back按键控制、软键盘控制、横竖屏控制、原生音频播放、前后台切换事件...
    流应用没有提供什么?
    流应用没有提供canvas加速器,所以裸奔体验也不错的游戏上流应用比较合适。

综上,可以看出流应用除了提供40万原生api外,在游戏的发行、留存、注册转换、支付、二次传播等方面均进行了强化处理,提升游戏的关键运营数据表现,并且在传奇世界H5的运行中用数据证明了提升效果。

那么如果你拥有一个裸奔体验不错的H5游戏,如何改造成流应用?
基本原则是你需要新建一个流应用微端项目,把微端项目提交到流应用平台,在微端项目里打开在线的H5 URL。

  1. 在http://DCloud.io下载HBuilder工具。这个工具是通用HTML5编辑器,App和web都可以开发。
  2. 在HBuilder里面新建一个移动App项目,打开里面的manifest.json,配好游戏的名称、ico、splash封面图片、splash手动关闭、全屏、设置硬件加速强制打开,参考http://ask.dcloud.net.cn/article/94
  3. 在index.html里跳转到目前的H5的网络URL。
  4. 点菜单发行-发行流应用,根据提示操作。
  5. 然后把H5游戏的现有项目也拖到HBuilder里,成为一个普通的web项目。
  6. 在web项目里写js,调用流应用提供的增强api。
    实现联合登陆plus.oauth、支付plus.payment、分享plus.share等功能。参考http://www.html5plus.org/doc/h5p.html。还可以在HBuilder里新建移动App时选Hello H5+模板,然后点菜单运行-真机运行这个项目来看各种api的调用示例。
    还需要监听back按键,最好是游戏里界面的返回响应plus.key里的back按键,如果没精力全部做,至少游戏退出时需要监听back,一般是监听双击,按一下back时提示一个toast:再按一次退出,然后按第二次back时退出。
  7. 根据流应用的UA来让这些js生效,流应用的ua里包含“StreamApp”字符串,如果要打包为apk或ipa发行,则ua包含"Html5Plus"字符串。其实不管是流应用发行还是原生包发行,只要使用DCloud的客户端引擎ua里就会有"Html5Plus"字符串,同时在流应用模型是ua多增加了“StreamApp”字符串。
  8. 特别要注意一点,大多数H5游戏都有一个网络加载的首屏,即先从服务器取一个首屏等待界面,然后后台继续载资源直到游戏可以进入。
    但在流应用里,这个模式不对。
    流应用splash封面图是本地化的,已经配在了manifest里,此时服务器不需要再请求一个等待界面,多浪费用户流量和增加等待时间。
    也就是从桌面点图标时,流应用与原生app一样是先启动本地splash封面图,然后等待游戏进入,游戏进入后再调用plus.navigator.closeSplashscreen()关闭splash图片即可。
  9. 还可以在你的H5游戏里内嵌一个gostream.js,在非流应用的环境下引入,这个js可以检测手机上是否有流应用引擎,如果有则可以秒开流应用,实现wap流量转换为app流量。参考http://ask.dcloud.net.cn/article/579

以上工作中,涉及增强api调用的工作并不是强制的,不调用也可以申请上线,就是一个普通的H5页游。
但这些增强api不调用,将影响数据转换。

流应用QQ交流群,请加:471285299。

继续阅读 »

传统的H5游戏,只能在浏览器里发行,不能在应用市场发行,也无法自动在桌面留有图标。
这样的H5游戏,体验不足,留存上不去。

流应用不是在浏览器里发行,而是在应用市场发行,在桌面天然有图标,但却也拥有即点即开的特性。
并且运行在流应用里,可以调用操作系统底层的40w api,可实现强大的功能。

下图为在360手机助手搜索传奇世界,可看到流应用的秒开按钮。

流应用为H5游戏提供了什么?

  1. 更高效的发行平台和留存率提升
    通过DCloud与应用市场的合作,流应用可发行到应用市场里,并基于DCloud的流式发行技术实现秒开,过去App下载、安装、启动这3步被合为一步。
    并且自动在桌面留存图标,不像浏览器那样是需要用户操作后才能创建到桌面上。这切实提高了留存率。
  2. 联合登陆-提升注册转化率
    通过流应用提供的联合登陆机制,可直接完成注册,避免用户注册账户的麻烦,白名单合作厂商还可以直接拿到手机号。
    这个机制可以切实提高注册转化率。
    以传奇世界H5的运行数据为例,流应用版的角色创建率比各版平均值提升75%。
  3. 原生支付控件-提升支付成功率
    在流应用平台里可以直接调起支付宝原生支付控件,如果开发商有微信wap支付权限,也可以直接在流应用里使用。
    通过更优秀的体验,可以提高支付成功率。
    以传奇世界H5的运行数据为例,流应用版的付费率比各版平均值提升100%,付费成功率提升50%。
  4. 社交分享-提升二次传播率
    流应用提供的社交分享能力,可以调起原生的微信、微博、qq、短信、邮件等各种社交分享通道,方便的邀请好友和传播。
    分享出去的链接别人点击后,如果手机上有流应用引擎,则会直接秒装好该游戏的流应用并进入特定界面,如果对方手机上没有流应用引擎则出现标准HTML5版本。
    注:流应用引擎的装机覆盖量过亿,目前测试数据是每3个Android设备就有一个能命中。
    通过流应用的分享机制,可以切实提高二次传播率。
  5. 更多操作系统的原生API
    事实上除了上面常用的增强API,流应用提供了原生操作系统40万API的调用能力,完全可以在流应用里随意调用原生API。
    开发者可以充分发挥想象力,摇一摇、扫一扫、原生定位、读取imei、back按键控制、软键盘控制、横竖屏控制、原生音频播放、前后台切换事件...
    流应用没有提供什么?
    流应用没有提供canvas加速器,所以裸奔体验也不错的游戏上流应用比较合适。

综上,可以看出流应用除了提供40万原生api外,在游戏的发行、留存、注册转换、支付、二次传播等方面均进行了强化处理,提升游戏的关键运营数据表现,并且在传奇世界H5的运行中用数据证明了提升效果。

那么如果你拥有一个裸奔体验不错的H5游戏,如何改造成流应用?
基本原则是你需要新建一个流应用微端项目,把微端项目提交到流应用平台,在微端项目里打开在线的H5 URL。

  1. 在http://DCloud.io下载HBuilder工具。这个工具是通用HTML5编辑器,App和web都可以开发。
  2. 在HBuilder里面新建一个移动App项目,打开里面的manifest.json,配好游戏的名称、ico、splash封面图片、splash手动关闭、全屏、设置硬件加速强制打开,参考http://ask.dcloud.net.cn/article/94
  3. 在index.html里跳转到目前的H5的网络URL。
  4. 点菜单发行-发行流应用,根据提示操作。
  5. 然后把H5游戏的现有项目也拖到HBuilder里,成为一个普通的web项目。
  6. 在web项目里写js,调用流应用提供的增强api。
    实现联合登陆plus.oauth、支付plus.payment、分享plus.share等功能。参考http://www.html5plus.org/doc/h5p.html。还可以在HBuilder里新建移动App时选Hello H5+模板,然后点菜单运行-真机运行这个项目来看各种api的调用示例。
    还需要监听back按键,最好是游戏里界面的返回响应plus.key里的back按键,如果没精力全部做,至少游戏退出时需要监听back,一般是监听双击,按一下back时提示一个toast:再按一次退出,然后按第二次back时退出。
  7. 根据流应用的UA来让这些js生效,流应用的ua里包含“StreamApp”字符串,如果要打包为apk或ipa发行,则ua包含"Html5Plus"字符串。其实不管是流应用发行还是原生包发行,只要使用DCloud的客户端引擎ua里就会有"Html5Plus"字符串,同时在流应用模型是ua多增加了“StreamApp”字符串。
  8. 特别要注意一点,大多数H5游戏都有一个网络加载的首屏,即先从服务器取一个首屏等待界面,然后后台继续载资源直到游戏可以进入。
    但在流应用里,这个模式不对。
    流应用splash封面图是本地化的,已经配在了manifest里,此时服务器不需要再请求一个等待界面,多浪费用户流量和增加等待时间。
    也就是从桌面点图标时,流应用与原生app一样是先启动本地splash封面图,然后等待游戏进入,游戏进入后再调用plus.navigator.closeSplashscreen()关闭splash图片即可。
  9. 还可以在你的H5游戏里内嵌一个gostream.js,在非流应用的环境下引入,这个js可以检测手机上是否有流应用引擎,如果有则可以秒开流应用,实现wap流量转换为app流量。参考http://ask.dcloud.net.cn/article/579

以上工作中,涉及增强api调用的工作并不是强制的,不调用也可以申请上线,就是一个普通的H5页游。
但这些增强api不调用,将影响数据转换。

流应用QQ交流群,请加:471285299。

收起阅读 »