HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

最新bh没得法配置支付参数了

HBuilder

最新bh没得法配置支付参数了

最新bh没得法配置支付参数了

请问hbuilder如何支持typescript和react?

HBuilder React Native

请问hbuilder如何支持typescript和react?

请问hbuilder如何支持typescript和react?

解决 HBuilder 7.2.1.201606142028 iOS无法真机调试问题

HBuilder

临时解决办法:
1.%HBuilder安装目录%\plugins\com.pandora.tools.android_1.0.0.201606082006\下修改preferences.ini文件中iphone_version=7.2.1 为 iphone_version=7.2.0

  1. 将同目录下base文件夹中的ipa基座替换成附件中的基座

http://pan.baidu.com/s/1eSufLYE

继续阅读 »

临时解决办法:
1.%HBuilder安装目录%\plugins\com.pandora.tools.android_1.0.0.201606082006\下修改preferences.ini文件中iphone_version=7.2.1 为 iphone_version=7.2.0

  1. 将同目录下base文件夹中的ipa基座替换成附件中的基座

http://pan.baidu.com/s/1eSufLYE

收起阅读 »

(iOS)总结一下这几天在使用5+SDK的时候遇到的问题

Payment 5+sdk

我是使用5+webApp加载网络链接,加载的网页是同事用Hbuilder写的(貌似是,对于h5不是太懂,大家不要喷)
遇到的第一个问题就是静态库添加进去会报错,building setting里面搜索search path,然后修改静态库的路径(必要的时候修改frameWork的路径), other link flag添加-ObjC(一定要注意大小写),如果配置都正确还是报错的话,很有可能就是缺少某些静态库
第二个问题就是我在使用payment模块的时候,按照文档上导入了三个支付所用到的静态库以后还是会报错,解决方法是再导入一个liblibpayment.a的静态库,Feature-iOS那个表格里没有写要加这一个(好气啊)。
还再继续摸索使用中,遇到的问题会及时分享。
最后,感谢工程师 DCloud_SDK_骁骑 对我的帮助,谢谢!

继续阅读 »

我是使用5+webApp加载网络链接,加载的网页是同事用Hbuilder写的(貌似是,对于h5不是太懂,大家不要喷)
遇到的第一个问题就是静态库添加进去会报错,building setting里面搜索search path,然后修改静态库的路径(必要的时候修改frameWork的路径), other link flag添加-ObjC(一定要注意大小写),如果配置都正确还是报错的话,很有可能就是缺少某些静态库
第二个问题就是我在使用payment模块的时候,按照文档上导入了三个支付所用到的静态库以后还是会报错,解决方法是再导入一个liblibpayment.a的静态库,Feature-iOS那个表格里没有写要加这一个(好气啊)。
还再继续摸索使用中,遇到的问题会及时分享。
最后,感谢工程师 DCloud_SDK_骁骑 对我的帮助,谢谢!

收起阅读 »

【在线等】发布版本后每个页面都会遮盖电源wifi图标,顶到头上了!【提了好几次的,真的着急】

直接连接数据线运行没有问题。只有生成app,安装后有问题!

直接连接数据线运行没有问题。只有生成app,安装后有问题!

组件

自定义模板组
 <ul class="mui-table-view">   
        <li class="mui-table-view-cell mui-collapse mui-active">  
            <a class="mui-navigate-right" href="#">面板1</a>  
            <div class="mui-collapse-content">  
                <p>面板1子内容</p>  
            </div>  
        </li>  
        <li class="mui-table-view-cell mui-collapse">  
            <a class="mui-navigate-right" href="#">面板</a>  
                <div class="mui-collapse-content">  
                <p>面板2子内容</p>  
            </div>  
        </li>  
        <li class="mui-table-view-cell mui-collapse">  
            <a class="mui-navigate-right" href="#">面板3</a>  
            <div class="mui-collapse-content">  
                <p>面板3子内容</p>  
            </div>  
        </li>   
    </ul>
继续阅读 »
 <ul class="mui-table-view">   
        <li class="mui-table-view-cell mui-collapse mui-active">  
            <a class="mui-navigate-right" href="#">面板1</a>  
            <div class="mui-collapse-content">  
                <p>面板1子内容</p>  
            </div>  
        </li>  
        <li class="mui-table-view-cell mui-collapse">  
            <a class="mui-navigate-right" href="#">面板</a>  
                <div class="mui-collapse-content">  
                <p>面板2子内容</p>  
            </div>  
        </li>  
        <li class="mui-table-view-cell mui-collapse">  
            <a class="mui-navigate-right" href="#">面板3</a>  
            <div class="mui-collapse-content">  
                <p>面板3子内容</p>  
            </div>  
        </li>   
    </ul>
收起阅读 »

mui中选项卡切换加下拉刷新,动态加载数据左右轮滑无效!

mui中选项卡切换加下拉刷新,动态加载数据左右轮滑无效!
具体代码如下:
json数据:```javascript
[{"title":"\u9505\u5e95","picurl":"","id":"445","plist":[{"id":"466","picurl":"http:\/\/www.baidu.com\/Uploads\/3295\/image\/20160510\/20160510151115_56636.jpg","title":"\u7ea2\u6c64\u9505\u5e95","price":"20","oldprice":"40","userid":"3295","description":"\u706b\u9505\u5e95\u6599\u79d8\u65b9(\u6b63\u5b97\u79d8\u65b9)","oncl":"36"}]},{"title":"\u8364\u83dc","picurl":"","id":"446","plist":[{"id":"467","picurl":"http:\/\/www.baidu.com\/Uploads\/3295\/image\/20160609\/20160609181009_11840.jpg","title":"\u8364\u83dc","price":"18","oldprice":"18","userid":"3295","description":"","oncl":"1"},{"id":"468","picurl":"http:\/\/www.baidu.com\/Uploads\/3295\/image\/20160609\/20160609181229_89288.jpg","title":"\u8364\u83dc1","price":"22","oldprice":"22","userid":"3295","description":"","oncl":"1"}]}]


html代码:
```javascript  
<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <title>Hello MUI</title>  
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">  
        <meta name="apple-mobile-web-app-capable" content="yes">  
        <meta name="apple-mobile-web-app-status-bar-style" content="black">  

        <link rel="stylesheet" href="../css/mui.min.css">  
        <style>  
            html,  
            body {  
                background-color: #efeff4;  
            }  
            .mui-bar~.mui-content .mui-fullscreen {  
                top: 44px;  
                height: auto;  
            }  
            .mui-pull-top-tips {  
                position: absolute;  
                top: -20px;  
                left: 50%;  
                margin-left: -25px;  
                width: 40px;  
                height: 40px;  
                border-radius: 100%;  
                z-index: 1;  
            }  
            .mui-bar~.mui-pull-top-tips {  
                top: 24px;  
            }  
            .mui-pull-top-wrapper {  
                width: 42px;  
                height: 42px;  
                display: block;  
                text-align: center;  
                background-color: #efeff4;  
                border: 1px solid #ddd;  
                border-radius: 25px;  
                background-clip: padding-box;  
                box-shadow: 0 4px 10px #bbb;  
                overflow: hidden;  
            }  
            .mui-pull-top-tips.mui-transitioning {  
                -webkit-transition-duration: 200ms;  
                transition-duration: 200ms;  
            }  
            .mui-pull-top-tips .mui-pull-loading {  
                /*-webkit-backface-visibility: hidden;  
                -webkit-transition-duration: 400ms;  
                transition-duration: 400ms;*/  

                margin: 0;  
            }  
            .mui-pull-top-wrapper .mui-icon,  
            .mui-pull-top-wrapper .mui-spinner {  
                margin-top: 7px;  
            }  
            .mui-pull-top-wrapper .mui-icon.mui-reverse {  
                /*-webkit-transform: rotate(180deg) translateZ(0);*/  
            }  
            .mui-pull-bottom-tips {  
                text-align: center;  
                background-color: #efeff4;  
                font-size: 15px;  
                line-height: 40px;  
                color: #777;  
            }  
            .mui-pull-top-canvas {  
                overflow: hidden;  
                background-color: #fafafa;  
                border-radius: 40px;  
                box-shadow: 0 4px 10px #bbb;  
                width: 40px;  
                height: 40px;  
                margin: 0 auto;  
            }  
            .mui-pull-top-canvas canvas {  
                width: 40px;  
            }  
            .mui-slider-indicator.mui-segmented-control {  
                background-color: #efeff4;  
            }  
            .mui-table-view .mui-media-object{ clear: both; line-height: 90px;  min-width: 110px;  height: 90px;}  
            .mui-segmented-control.mui-scroll-wrapper .mui-control-item{ padding:0 5px}  
        </style>  
    </head>  

    <body>  
        <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">选项卡切换+下拉刷新</h1>  
        </header>  
        <div class="mui-content">  
            <div id="slider" class="mui-slider mui-fullscreen">  
                <div id="sliderSegmentedControl" class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">  
                    <div class="mui-scroll" id="toplist"></div>  
                </div>  
                <div class="mui-slider-group" id="mylistall"></div>  
            </div>  
        </div>  
        <script src="../js/mui.min.js"></script>  
        <script src="../js/app.js"></script>  
        <script src="../js/mui.pullToRefresh.js"></script>  
        <script src="../js/mui.pullToRefresh.material.js"></script>  
        <script>  
            var id='';  
            mui.init();  
            (function($) {  
                //阻尼系数  
                var deceleration = mui.os.ios?0.003:0.0009;  
                $('.mui-scroll-wrapper').scroll({  
                    bounce: false,  
                    indicators: true, //是否显示滚动条  
                    deceleration:deceleration  
                });  
                window.addEventListener('newsId',function(event){  
                    id =event.detail.id;  

                })  
                $.ready(function() {  
                    loaddatelist.usershoptype(id, function(rs) {  
                        var ll=rs.length,mylist='',aa='',mlist='',mylenght;  
                        for(i=1;i<=ll;i++){  
                            if(i<=1){  
                                aa+='<a class="mui-control-item mui-active" href="#item'+i+'mobile">'+rs[i-1]['title']+'</a>';  
                                mylist+='<div id="item'+i+'mobile" class="mui-slider-item mui-control-content mui-active"><div id="scroll'+i+'" class="mui-scroll-wrapper"><div class="mui-scroll"><ul class="mui-table-view">';  
                            }else{  
                                aa+='<a class="mui-control-item" href="#item'+i+'mobile">'+rs[i-1]['title']+'</a>';  
                                mylist+='<div id="item'+i+'mobile" class="mui-slider-item mui-control-content"><div id="scroll'+i+'" class="mui-scroll-wrapper"><div class="mui-scroll"><ul class="mui-table-view">';  
                            }  
                            mlist=rs[i-1]["plist"];  
                            mylenght=mlist.length;  
                            for(ii=0;ii<mylenght;ii++){   
                                mylist+='<li class="mui-table-view-cell mui-media"><a href="javascript:;"><img class="mui-media-object mui-pull-left" src="'+mlist[ii]['picurl']+'"><div class="mui-media-body">'+mlist[ii]['title']+'<p class="mui-ellipsis">'+mlist[ii]['title']+'</p></div></a></li>';  
                            }  
                            mylist+='</ul></div></div></div>';  
                        }  
                        document.getElementById("toplist").innerHTML=aa;  
                        document.getElementById("mylistall").innerHTML=mylist;  
                        alert(mylist);  
                        //循环初始化所有下拉刷新,上拉加载。  
                        $.each(document.querySelectorAll('.mui-slider-group .mui-scroll'), function(index, pullRefreshEl) {  
                            $(pullRefreshEl).pullToRefresh({  
                                down: {  
                                    callback: function() {  
                                        var self = this;  
                                        setTimeout(function() {  
                                            var ul = self.element.querySelector('.mui-table-view');  
                                            ul.insertBefore(createFragment(ul, index, 15, true), ul.firstChild);  
                                            self.endPullDownToRefresh();  
                                        }, 1000);  
                                    }  
                                },  
                                up: {  
                                    callback: function() {  
                                        var self = this;  
                                        setTimeout(function() {  
                                            var ul = self.element.querySelector('.mui-table-view');  
                                            ul.appendChild(createFragment(ul, index, 15));  
                                            self.endPullUpToRefresh();  
                                        }, 1000);  
                                    }  
                                }  
                            });  
                        });  
                    });  
                    mui('#toplist').on('tap', 'a', function(e) {  
                        var href=document.body.querySelector('#toplist a').href;  
                        //alert(href);  
                    });  
                    var createFragment = function(ul, index, count, reverse) {  
                        var length = ul.querySelectorAll('li').length;  
                        var fragment = document.createDocumentFragment();  
                        var li;  
                        for (var i = 0; i < count; i++) {  
                            li = document.createElement('li');  
                            li.className = 'mui-table-view-cell';  
                            //li.innerHTML = '第' + (index + 1) + '个选项卡子项=====-' + (length + (reverse ? (count - i) : (i + 1)));  
                            li.innerHTML='<a href="javascript:;"><img class="mui-media-object mui-pull-left" src="http://www.360meimei.com/Public/images/no_logo.png"><div class="mui-media-body">幸福<p class="mui-ellipsis">能和心爱的人一起睡觉,是件幸福的事情;可是,打呼噜怎么办?</p></div></a>';  
                            fragment.appendChild(li);  
                        }  
                        return fragment;  
                    };  
                });  
            })(mui);  
        </script>  
    </body>  

</html>
继续阅读 »

mui中选项卡切换加下拉刷新,动态加载数据左右轮滑无效!
具体代码如下:
json数据:```javascript
[{"title":"\u9505\u5e95","picurl":"","id":"445","plist":[{"id":"466","picurl":"http:\/\/www.baidu.com\/Uploads\/3295\/image\/20160510\/20160510151115_56636.jpg","title":"\u7ea2\u6c64\u9505\u5e95","price":"20","oldprice":"40","userid":"3295","description":"\u706b\u9505\u5e95\u6599\u79d8\u65b9(\u6b63\u5b97\u79d8\u65b9)","oncl":"36"}]},{"title":"\u8364\u83dc","picurl":"","id":"446","plist":[{"id":"467","picurl":"http:\/\/www.baidu.com\/Uploads\/3295\/image\/20160609\/20160609181009_11840.jpg","title":"\u8364\u83dc","price":"18","oldprice":"18","userid":"3295","description":"","oncl":"1"},{"id":"468","picurl":"http:\/\/www.baidu.com\/Uploads\/3295\/image\/20160609\/20160609181229_89288.jpg","title":"\u8364\u83dc1","price":"22","oldprice":"22","userid":"3295","description":"","oncl":"1"}]}]


html代码:
```javascript  
<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <title>Hello MUI</title>  
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">  
        <meta name="apple-mobile-web-app-capable" content="yes">  
        <meta name="apple-mobile-web-app-status-bar-style" content="black">  

        <link rel="stylesheet" href="../css/mui.min.css">  
        <style>  
            html,  
            body {  
                background-color: #efeff4;  
            }  
            .mui-bar~.mui-content .mui-fullscreen {  
                top: 44px;  
                height: auto;  
            }  
            .mui-pull-top-tips {  
                position: absolute;  
                top: -20px;  
                left: 50%;  
                margin-left: -25px;  
                width: 40px;  
                height: 40px;  
                border-radius: 100%;  
                z-index: 1;  
            }  
            .mui-bar~.mui-pull-top-tips {  
                top: 24px;  
            }  
            .mui-pull-top-wrapper {  
                width: 42px;  
                height: 42px;  
                display: block;  
                text-align: center;  
                background-color: #efeff4;  
                border: 1px solid #ddd;  
                border-radius: 25px;  
                background-clip: padding-box;  
                box-shadow: 0 4px 10px #bbb;  
                overflow: hidden;  
            }  
            .mui-pull-top-tips.mui-transitioning {  
                -webkit-transition-duration: 200ms;  
                transition-duration: 200ms;  
            }  
            .mui-pull-top-tips .mui-pull-loading {  
                /*-webkit-backface-visibility: hidden;  
                -webkit-transition-duration: 400ms;  
                transition-duration: 400ms;*/  

                margin: 0;  
            }  
            .mui-pull-top-wrapper .mui-icon,  
            .mui-pull-top-wrapper .mui-spinner {  
                margin-top: 7px;  
            }  
            .mui-pull-top-wrapper .mui-icon.mui-reverse {  
                /*-webkit-transform: rotate(180deg) translateZ(0);*/  
            }  
            .mui-pull-bottom-tips {  
                text-align: center;  
                background-color: #efeff4;  
                font-size: 15px;  
                line-height: 40px;  
                color: #777;  
            }  
            .mui-pull-top-canvas {  
                overflow: hidden;  
                background-color: #fafafa;  
                border-radius: 40px;  
                box-shadow: 0 4px 10px #bbb;  
                width: 40px;  
                height: 40px;  
                margin: 0 auto;  
            }  
            .mui-pull-top-canvas canvas {  
                width: 40px;  
            }  
            .mui-slider-indicator.mui-segmented-control {  
                background-color: #efeff4;  
            }  
            .mui-table-view .mui-media-object{ clear: both; line-height: 90px;  min-width: 110px;  height: 90px;}  
            .mui-segmented-control.mui-scroll-wrapper .mui-control-item{ padding:0 5px}  
        </style>  
    </head>  

    <body>  
        <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">选项卡切换+下拉刷新</h1>  
        </header>  
        <div class="mui-content">  
            <div id="slider" class="mui-slider mui-fullscreen">  
                <div id="sliderSegmentedControl" class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">  
                    <div class="mui-scroll" id="toplist"></div>  
                </div>  
                <div class="mui-slider-group" id="mylistall"></div>  
            </div>  
        </div>  
        <script src="../js/mui.min.js"></script>  
        <script src="../js/app.js"></script>  
        <script src="../js/mui.pullToRefresh.js"></script>  
        <script src="../js/mui.pullToRefresh.material.js"></script>  
        <script>  
            var id='';  
            mui.init();  
            (function($) {  
                //阻尼系数  
                var deceleration = mui.os.ios?0.003:0.0009;  
                $('.mui-scroll-wrapper').scroll({  
                    bounce: false,  
                    indicators: true, //是否显示滚动条  
                    deceleration:deceleration  
                });  
                window.addEventListener('newsId',function(event){  
                    id =event.detail.id;  

                })  
                $.ready(function() {  
                    loaddatelist.usershoptype(id, function(rs) {  
                        var ll=rs.length,mylist='',aa='',mlist='',mylenght;  
                        for(i=1;i<=ll;i++){  
                            if(i<=1){  
                                aa+='<a class="mui-control-item mui-active" href="#item'+i+'mobile">'+rs[i-1]['title']+'</a>';  
                                mylist+='<div id="item'+i+'mobile" class="mui-slider-item mui-control-content mui-active"><div id="scroll'+i+'" class="mui-scroll-wrapper"><div class="mui-scroll"><ul class="mui-table-view">';  
                            }else{  
                                aa+='<a class="mui-control-item" href="#item'+i+'mobile">'+rs[i-1]['title']+'</a>';  
                                mylist+='<div id="item'+i+'mobile" class="mui-slider-item mui-control-content"><div id="scroll'+i+'" class="mui-scroll-wrapper"><div class="mui-scroll"><ul class="mui-table-view">';  
                            }  
                            mlist=rs[i-1]["plist"];  
                            mylenght=mlist.length;  
                            for(ii=0;ii<mylenght;ii++){   
                                mylist+='<li class="mui-table-view-cell mui-media"><a href="javascript:;"><img class="mui-media-object mui-pull-left" src="'+mlist[ii]['picurl']+'"><div class="mui-media-body">'+mlist[ii]['title']+'<p class="mui-ellipsis">'+mlist[ii]['title']+'</p></div></a></li>';  
                            }  
                            mylist+='</ul></div></div></div>';  
                        }  
                        document.getElementById("toplist").innerHTML=aa;  
                        document.getElementById("mylistall").innerHTML=mylist;  
                        alert(mylist);  
                        //循环初始化所有下拉刷新,上拉加载。  
                        $.each(document.querySelectorAll('.mui-slider-group .mui-scroll'), function(index, pullRefreshEl) {  
                            $(pullRefreshEl).pullToRefresh({  
                                down: {  
                                    callback: function() {  
                                        var self = this;  
                                        setTimeout(function() {  
                                            var ul = self.element.querySelector('.mui-table-view');  
                                            ul.insertBefore(createFragment(ul, index, 15, true), ul.firstChild);  
                                            self.endPullDownToRefresh();  
                                        }, 1000);  
                                    }  
                                },  
                                up: {  
                                    callback: function() {  
                                        var self = this;  
                                        setTimeout(function() {  
                                            var ul = self.element.querySelector('.mui-table-view');  
                                            ul.appendChild(createFragment(ul, index, 15));  
                                            self.endPullUpToRefresh();  
                                        }, 1000);  
                                    }  
                                }  
                            });  
                        });  
                    });  
                    mui('#toplist').on('tap', 'a', function(e) {  
                        var href=document.body.querySelector('#toplist a').href;  
                        //alert(href);  
                    });  
                    var createFragment = function(ul, index, count, reverse) {  
                        var length = ul.querySelectorAll('li').length;  
                        var fragment = document.createDocumentFragment();  
                        var li;  
                        for (var i = 0; i < count; i++) {  
                            li = document.createElement('li');  
                            li.className = 'mui-table-view-cell';  
                            //li.innerHTML = '第' + (index + 1) + '个选项卡子项=====-' + (length + (reverse ? (count - i) : (i + 1)));  
                            li.innerHTML='<a href="javascript:;"><img class="mui-media-object mui-pull-left" src="http://www.360meimei.com/Public/images/no_logo.png"><div class="mui-media-body">幸福<p class="mui-ellipsis">能和心爱的人一起睡觉,是件幸福的事情;可是,打呼噜怎么办?</p></div></a>';  
                            fragment.appendChild(li);  
                        }  
                        return fragment;  
                    };  
                });  
            })(mui);  
        </script>  
    </body>  

</html>
收起阅读 »

放一个自己做的蛋糕APP 带全部源码

案例 移动APP

页面做的比较糙 大家多见谅 看大家发的比较少 就算是抛砖引玉了

首页

具体的大家下了自己看吧 有什么问题留言

页面做的比较糙 大家多见谅 看大家发的比较少 就算是抛砖引玉了

首页

具体的大家下了自己看吧 有什么问题留言

Android以Widget方式集成自己的hbuilder项目-----Anroid Studio版

一、准备
1> 在http://ask.dcloud.net.cn/article/103下载最新Android平台的5+SDK的demo以及相关文件
二、创建项目
1> 用Hbuilder创建一个自己的项目
2> 用Android studio创建一个demo(我用的是as2.0)
三、最核心步骤(copy)
1> 如何将自己的Hbuilder项目放入andrid studio项目
在as项目中创建目录:src/main/assets/apps/对应的id/www/项目内容,并将hb项目下面的代码copy过来,详情见图

此时需要注意的是:“src/main/assets/apps/对应的id/www/项目内容”中的“对应的id”要求与hb项目中manifest.json文件中id一致。

2> 导入需要的.jar等(这地方我就有些地方直接摘抄别人的了哈,懒得打字了)

  1. src/main/assets/data 从 Android-SDK/SDK/assets/data 拷贝来的,此处有几个值需要对应,如图:
  2. src/main/java/io/dcloud/RInformation.java 从 Android-SDK\SDK\src 拷贝来的
  3. src/main/res 从 Android-SDK\SDK\res 拷贝来的
    ps: 1.5下面只有一个drawable,drawable-hapi等几个长得很像的文件夹不要放在mipmap-hdpi、mipmap-mdpi文件夹里,重新新建这几个文件
    夹。values文件夹下的文件,你自己没有的就直接copy过来,自己有的(比如strings.xml),就把其中的代码新增进来。
  4. 将Android-SDK\HBuilder-Integrate下的libs中的东西copy到as项目的libs中,此处注意:除了android-support-v4.jar(如果你项目没有,那
    就别复制过去了,我复制过去会报错)。
  5. 把Android-SDK\HBuilder-Integrate\src\com\HBuilder\integrate\SDK_WebApp.java 拷贝到eclipse项目的src包名下,并修改ppBasePath, 为
    assets的app路径,如图:
  6. 修改启动页面,并且将Android-SDK\HBuilder-Integrate\AndroidManifest.xml中的权限全部copy到你的AndroidManifest.xml中(我是图省事
    哈,这样不专业,嘿嘿~),如图:

以上步骤后,就可以实现在Android studio中运行你的项目了!eclipse的与android studio集成类似!~~~本人才开始用Dcloud,有问题希望大家多多指点

继续阅读 »

一、准备
1> 在http://ask.dcloud.net.cn/article/103下载最新Android平台的5+SDK的demo以及相关文件
二、创建项目
1> 用Hbuilder创建一个自己的项目
2> 用Android studio创建一个demo(我用的是as2.0)
三、最核心步骤(copy)
1> 如何将自己的Hbuilder项目放入andrid studio项目
在as项目中创建目录:src/main/assets/apps/对应的id/www/项目内容,并将hb项目下面的代码copy过来,详情见图

此时需要注意的是:“src/main/assets/apps/对应的id/www/项目内容”中的“对应的id”要求与hb项目中manifest.json文件中id一致。

2> 导入需要的.jar等(这地方我就有些地方直接摘抄别人的了哈,懒得打字了)

  1. src/main/assets/data 从 Android-SDK/SDK/assets/data 拷贝来的,此处有几个值需要对应,如图:
  2. src/main/java/io/dcloud/RInformation.java 从 Android-SDK\SDK\src 拷贝来的
  3. src/main/res 从 Android-SDK\SDK\res 拷贝来的
    ps: 1.5下面只有一个drawable,drawable-hapi等几个长得很像的文件夹不要放在mipmap-hdpi、mipmap-mdpi文件夹里,重新新建这几个文件
    夹。values文件夹下的文件,你自己没有的就直接copy过来,自己有的(比如strings.xml),就把其中的代码新增进来。
  4. 将Android-SDK\HBuilder-Integrate下的libs中的东西copy到as项目的libs中,此处注意:除了android-support-v4.jar(如果你项目没有,那
    就别复制过去了,我复制过去会报错)。
  5. 把Android-SDK\HBuilder-Integrate\src\com\HBuilder\integrate\SDK_WebApp.java 拷贝到eclipse项目的src包名下,并修改ppBasePath, 为
    assets的app路径,如图:
  6. 修改启动页面,并且将Android-SDK\HBuilder-Integrate\AndroidManifest.xml中的权限全部copy到你的AndroidManifest.xml中(我是图省事
    哈,这样不专业,嘿嘿~),如图:

以上步骤后,就可以实现在Android studio中运行你的项目了!eclipse的与android studio集成类似!~~~本人才开始用Dcloud,有问题希望大家多多指点

收起阅读 »

手机端监听短信验证码并自动提交表单

短信监听 短信验证码

重要说明

鉴定短信验证码仅能在App端实现,其他端无法使用。但在App端,更为合理的方式其实是使用一键登录。即无需短信验证码,一键登录获取真实的手机号。
一键登陆的体验比短信验证码好很多,不需等待验证码、输入验证码,并且一键登陆的费用比短信便宜不少。
所以强烈推荐改用一键登陆,uni一键登陆的文档另见:https://uniapp.dcloud.net.cn/univerify

----------------------------------如不使用一键登陆,请继续阅读下文----------------------------------

目前很多App都选择使用手机号注册或手机号加动态验证码登录的方式,此时用户需要等待短信验证码,然后手动填写,再点击注册或登录按钮,完成注册登录操作。

本文介绍如何利用native.js,实现系统监听短信验证码并帮助用户自动填写验证码输入框,自动提交登录表单。

备注:目前仅支持Android平台

代码主要分为两个部分:

  • 标准短信监听部分
  • 个性短信内容及登录界面适配部分

标准短信监听部分
该部分为标准函数,开发者基本无需修改;

var callbacks = [];  
var receiver;  
var filter;  
var main;  
var isInit = false;  
var isRegistered = false;  
var isOlderVersion = false;  

//plusReady封装,若使用mui,可直接使用mui.plusReady()方法;  
var plusReady = function(){  
     if (window.plus) {  
        callback();  
    } else {  
        document.addEventListener("plusready", function() {  
            callback();  
        }, false);  
    }  
}  

/**  
* 初始化  
*/  
var init = function(callback) {  
    //仅支持Android版本  
    if (plus.os.name !== 'Android') {  
        return;  
    }  
    try {  
        var version = plus.runtime.innerVersion.split('.');  
        isOlderVersion = parseInt(version[version.length - 1]) < 22298;  
        main = plus.android.runtimeMainActivity();  
        var Intent = plus.android.importClass('android.content.Intent');  
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
        var SmsMessage = plus.android.importClass('android.telephony.SmsMessage');  
        var receiverClass = 'io.dcloud.feature.internal.reflect.BroadcastReceiver';  
        if (isOlderVersion) {  
            receiverClass = 'io.dcloud.feature.internal.a.a';  
        }  
        filter = new IntentFilter();  
        var onReceiveCallback = function(context, intent) {  
            try {  
                var action = intent.getAction();  
                if (action == "android.provider.Telephony.SMS_RECEIVED") {  
                    var pdus = intent.getSerializableExtra("pdus");  
                    var msgs = [];  
                    for (var i = 0, len = pdus.length; i < len; i++) {  
                        msgs.push(SmsMessage.createFromPdu(pdus[i]));  
                    }  
                    for (var i = 0, len = callbacks.length; i < len; i++) {  
                        callbacks[i](msgs);  
                    }  
                }  
            } catch (e) {}  
        }  
        receiver = plus.android.implements(receiverClass, {  
            a: onReceiveCallback,  
            onReceive: onReceiveCallback  
        });  
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");  
        callback && callback();  
    } catch (e) {}  
}  

//注册短信监听  
var register = function(callback) {  
    callbacks.push(callback);  
    if (!isInit) {  
        isInit = isRegistered = true;  
        plusReady(function() {  
            init(function() {  
                setTimeout(function() {  
                    //                  console.log('registerReceiver');  
                    try {  
                        if (isOlderVersion) {  
                            main.a(receiver, filter);  
                        } else {  
                            main.registerReceiver(receiver, filter); //注册监听  
                        }  
                    } catch (e) {}  
                }, 300);  
            });  
        });  
    } else if (!isRegistered) {  
        //      console.log('registerReceiver');  
        try {  
            if (isOlderVersion) {  
                main.a(receiver, filter);  
            } else {  
                main.registerReceiver(receiver, filter); //注册监听  
            }  
        } catch (e) {}  
    }  
};  
//注销监听,在登录成功或从登录页跳转到其它页面后调用  
var unregister = function(callback, remove) {  
    for (var i = 0, len = callbacks.length; i < len; i++) {  
        if (callbacks[i] === callback) {  
            callbacks.splice(i, 1);  
        }  
    }  
    if (remove && !callbacks.length) {  
        if (main && isRegistered) {  
            try {  
                if (isOlderVersion) {  
                    main.a(receiver);  
                } else {  
                    main.unregisterReceiver(receiver);  
                }  
            } catch (e) {}  
            isRegistered = false;  
            //          console.log('unregisterReceiver');  
        }  
    }  
};

个性短信内容及登录界面适配部分
这部分开发者需要根据具体App或登录页面,修改短信匹配内容和验证码输入框选择器,参考如下注释

//验证码匹配规则,需要根据实际站点匹配  
var codeRegex = /[0-9]{6}/g;  

var handleSMS = function(msgs) {  
    for (var i = 0, len = msgs.length; i < len; i++) {  
        var content = msgs[i].getDisplayMessageBody();  
        //匹配短信内容,若短信内容包含“XX网”,则认为初步匹配成功  
        if (~content.indexOf('XX网')) {  
            //匹配验证码规则,比如包含6位数字  
            var matches = content.match(codeRegex);  
            if (matches && matches.length) {  
                var code = matches[0];  
                //验证码输入框控件,需根据实际页面修改选择器  
                var codeElem = document.querySelector('.login-view form input[type="password"]');  
                if (codeElem) {  
                    codeElem.value = code;  

                    //TODO 这里可以取消短信监听  

                    //模拟表单提交,需根据实际页面修改选择器  
                    document.querySelector('.login-view form button[type="submit"]').click();  
                    plus.nativeUI.toast('获取短信验证码成功,自动登录..');  

                }  
                break;  
            }  
        }  
    }  
};  

//登录页面注册短信监听事件  
register(handleSMS);
继续阅读 »

重要说明

鉴定短信验证码仅能在App端实现,其他端无法使用。但在App端,更为合理的方式其实是使用一键登录。即无需短信验证码,一键登录获取真实的手机号。
一键登陆的体验比短信验证码好很多,不需等待验证码、输入验证码,并且一键登陆的费用比短信便宜不少。
所以强烈推荐改用一键登陆,uni一键登陆的文档另见:https://uniapp.dcloud.net.cn/univerify

----------------------------------如不使用一键登陆,请继续阅读下文----------------------------------

目前很多App都选择使用手机号注册或手机号加动态验证码登录的方式,此时用户需要等待短信验证码,然后手动填写,再点击注册或登录按钮,完成注册登录操作。

本文介绍如何利用native.js,实现系统监听短信验证码并帮助用户自动填写验证码输入框,自动提交登录表单。

备注:目前仅支持Android平台

代码主要分为两个部分:

  • 标准短信监听部分
  • 个性短信内容及登录界面适配部分

标准短信监听部分
该部分为标准函数,开发者基本无需修改;

var callbacks = [];  
var receiver;  
var filter;  
var main;  
var isInit = false;  
var isRegistered = false;  
var isOlderVersion = false;  

//plusReady封装,若使用mui,可直接使用mui.plusReady()方法;  
var plusReady = function(){  
     if (window.plus) {  
        callback();  
    } else {  
        document.addEventListener("plusready", function() {  
            callback();  
        }, false);  
    }  
}  

/**  
* 初始化  
*/  
var init = function(callback) {  
    //仅支持Android版本  
    if (plus.os.name !== 'Android') {  
        return;  
    }  
    try {  
        var version = plus.runtime.innerVersion.split('.');  
        isOlderVersion = parseInt(version[version.length - 1]) < 22298;  
        main = plus.android.runtimeMainActivity();  
        var Intent = plus.android.importClass('android.content.Intent');  
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
        var SmsMessage = plus.android.importClass('android.telephony.SmsMessage');  
        var receiverClass = 'io.dcloud.feature.internal.reflect.BroadcastReceiver';  
        if (isOlderVersion) {  
            receiverClass = 'io.dcloud.feature.internal.a.a';  
        }  
        filter = new IntentFilter();  
        var onReceiveCallback = function(context, intent) {  
            try {  
                var action = intent.getAction();  
                if (action == "android.provider.Telephony.SMS_RECEIVED") {  
                    var pdus = intent.getSerializableExtra("pdus");  
                    var msgs = [];  
                    for (var i = 0, len = pdus.length; i < len; i++) {  
                        msgs.push(SmsMessage.createFromPdu(pdus[i]));  
                    }  
                    for (var i = 0, len = callbacks.length; i < len; i++) {  
                        callbacks[i](msgs);  
                    }  
                }  
            } catch (e) {}  
        }  
        receiver = plus.android.implements(receiverClass, {  
            a: onReceiveCallback,  
            onReceive: onReceiveCallback  
        });  
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");  
        callback && callback();  
    } catch (e) {}  
}  

//注册短信监听  
var register = function(callback) {  
    callbacks.push(callback);  
    if (!isInit) {  
        isInit = isRegistered = true;  
        plusReady(function() {  
            init(function() {  
                setTimeout(function() {  
                    //                  console.log('registerReceiver');  
                    try {  
                        if (isOlderVersion) {  
                            main.a(receiver, filter);  
                        } else {  
                            main.registerReceiver(receiver, filter); //注册监听  
                        }  
                    } catch (e) {}  
                }, 300);  
            });  
        });  
    } else if (!isRegistered) {  
        //      console.log('registerReceiver');  
        try {  
            if (isOlderVersion) {  
                main.a(receiver, filter);  
            } else {  
                main.registerReceiver(receiver, filter); //注册监听  
            }  
        } catch (e) {}  
    }  
};  
//注销监听,在登录成功或从登录页跳转到其它页面后调用  
var unregister = function(callback, remove) {  
    for (var i = 0, len = callbacks.length; i < len; i++) {  
        if (callbacks[i] === callback) {  
            callbacks.splice(i, 1);  
        }  
    }  
    if (remove && !callbacks.length) {  
        if (main && isRegistered) {  
            try {  
                if (isOlderVersion) {  
                    main.a(receiver);  
                } else {  
                    main.unregisterReceiver(receiver);  
                }  
            } catch (e) {}  
            isRegistered = false;  
            //          console.log('unregisterReceiver');  
        }  
    }  
};

个性短信内容及登录界面适配部分
这部分开发者需要根据具体App或登录页面,修改短信匹配内容和验证码输入框选择器,参考如下注释

//验证码匹配规则,需要根据实际站点匹配  
var codeRegex = /[0-9]{6}/g;  

var handleSMS = function(msgs) {  
    for (var i = 0, len = msgs.length; i < len; i++) {  
        var content = msgs[i].getDisplayMessageBody();  
        //匹配短信内容,若短信内容包含“XX网”,则认为初步匹配成功  
        if (~content.indexOf('XX网')) {  
            //匹配验证码规则,比如包含6位数字  
            var matches = content.match(codeRegex);  
            if (matches && matches.length) {  
                var code = matches[0];  
                //验证码输入框控件,需根据实际页面修改选择器  
                var codeElem = document.querySelector('.login-view form input[type="password"]');  
                if (codeElem) {  
                    codeElem.value = code;  

                    //TODO 这里可以取消短信监听  

                    //模拟表单提交,需根据实际页面修改选择器  
                    document.querySelector('.login-view form button[type="submit"]').click();  
                    plus.nativeUI.toast('获取短信验证码成功,自动登录..');  

                }  
                break;  
            }  
        }  
    }  
};  

//登录页面注册短信监听事件  
register(handleSMS);
收起阅读 »

MUI从入门到精通

教程

从网络上发现MUI不错的系列教程:
MUI从入门到精通https://segmentfault.com/blog/mui

从网络上发现MUI不错的系列教程:
MUI从入门到精通https://segmentfault.com/blog/mui