
请问hbuilder如何支持typescript和react?
请问hbuilder如何支持typescript和react?
请问hbuilder如何支持typescript和react?

解决 HBuilder 7.2.1.201606142028 iOS无法真机调试问题
临时解决办法:
1.%HBuilder安装目录%\plugins\com.pandora.tools.android_1.0.0.201606082006\下修改preferences.ini文件中iphone_version=7.2.1 为 iphone_version=7.2.0

- 将同目录下base文件夹中的ipa基座替换成附件中的基座
临时解决办法:
1.%HBuilder安装目录%\plugins\com.pandora.tools.android_1.0.0.201606082006\下修改preferences.ini文件中iphone_version=7.2.1 为 iphone_version=7.2.0
- 将同目录下base文件夹中的ipa基座替换成附件中的基座
http://pan.baidu.com/s/1eSufLYE
收起阅读 »
(iOS)总结一下这几天在使用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>
收起阅读 »

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等(这地方我就有些地方直接摘抄别人的了哈,懒得打字了)
- src/main/assets/data 从 Android-SDK/SDK/assets/data 拷贝来的,此处有几个值需要对应,如图:
- src/main/java/io/dcloud/RInformation.java 从 Android-SDK\SDK\src 拷贝来的
- src/main/res 从 Android-SDK\SDK\res 拷贝来的
ps: 1.5下面只有一个drawable,drawable-hapi等几个长得很像的文件夹不要放在mipmap-hdpi、mipmap-mdpi文件夹里,重新新建这几个文件
夹。values文件夹下的文件,你自己没有的就直接copy过来,自己有的(比如strings.xml),就把其中的代码新增进来。 - 将Android-SDK\HBuilder-Integrate下的libs中的东西copy到as项目的libs中,此处注意:除了android-support-v4.jar(如果你项目没有,那
就别复制过去了,我复制过去会报错)。 - 把Android-SDK\HBuilder-Integrate\src\com\HBuilder\integrate\SDK_WebApp.java 拷贝到eclipse项目的src包名下,并修改ppBasePath, 为
assets的app路径,如图:
- 修改启动页面,并且将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等(这地方我就有些地方直接摘抄别人的了哈,懒得打字了)
- src/main/assets/data 从 Android-SDK/SDK/assets/data 拷贝来的,此处有几个值需要对应,如图:
- src/main/java/io/dcloud/RInformation.java 从 Android-SDK\SDK\src 拷贝来的
- src/main/res 从 Android-SDK\SDK\res 拷贝来的
ps: 1.5下面只有一个drawable,drawable-hapi等几个长得很像的文件夹不要放在mipmap-hdpi、mipmap-mdpi文件夹里,重新新建这几个文件
夹。values文件夹下的文件,你自己没有的就直接copy过来,自己有的(比如strings.xml),就把其中的代码新增进来。 - 将Android-SDK\HBuilder-Integrate下的libs中的东西copy到as项目的libs中,此处注意:除了android-support-v4.jar(如果你项目没有,那
就别复制过去了,我复制过去会报错)。 - 把Android-SDK\HBuilder-Integrate\src\com\HBuilder\integrate\SDK_WebApp.java 拷贝到eclipse项目的src包名下,并修改ppBasePath, 为
assets的app路径,如图:
- 修改启动页面,并且将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