HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

承接整套网站建设(前后台都可),UI设计,webAPP建设,微信公众平台等

生活不易
生活不易
生活不易
承接整套网站建设(前后台都可),UI设计,webAPP建设,微信公众平台等项目。
能力足够,可以先加Q看我的成品
QQ46174188646

生活不易
生活不易
生活不易
承接整套网站建设(前后台都可),UI设计,webAPP建设,微信公众平台等项目。
能力足够,可以先加Q看我的成品
QQ46174188646

最新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);
收起阅读 »