
PHP 在这里就配不上工程师名字了吗?
PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?
PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?PHP 在这里就配不上工程师名字了吗?
收起阅读 »
制作App发布页面 - DCloud云服务
App发布页已全面升级为uni-portal插件
,点击了解详情。
uni-portal插件
作为uni-admin
的插件,支持快捷部署,支持上传uniCloud静态网页托管,推荐使用。
===============================================
如下是历史文档,已关闭新注册入口。
===============================================
App/小程序开发完了,还得做一个发布页面?
PC、手机兼容不同屏幕?
iOS浏览器、Android浏览器、微信浏览器判断不同逻辑?
自己制作二维码?
如果小程序有多个版本,微信、支付宝、百度、QQ、快应用,那搞起来。。。
别急,有了DCloud发布平台,一切迎刃而解。无需编程,填写表单直接生成发布页!
先睹为快,通过手机或PC浏览器,访问 https://m3w.cn/uniapp ,体验hello uni-app的发行下载页面。
注意:鉴于相关部门的监管政策,使用“制作发行页面”功能之前,会提示开发者先完成身份认证,详细认证流程参考DCloud 开发者实名认证流程。
产品特征
制作App发布页面,是DCloud公司为开发者提供的一项福利,通过简单的表单配置,即可在线生成App下载页。
该产品该具备如下特点:
- 免开发:简单配置直接发布,省人力
- 响应式:兼容PC/手机浏览器,自动识别Android、iOS、微信内置浏览器
- 短地址:下载页面地址类似 https://m3w.cn/uniapp ,好记、易传播
- 功能全:支持iOS、Android App和小程序的统一发布
- 云加速:发布后自动同步CDN,降低访问延迟,提升服务可用性
- 免费!免费!免费!
制作方法
目前开发者可以通过两个入口制作App发布页面:
- 在HBuilderX中,选择一个uni-app/5+/wap2app项目,在顶部菜单中点击“发行 —> 生成统一发布页面”
- 登录dev开发者中心,在应用列表界面,选择需要发布的应用,点击“发行”按钮
打开制作下载页面链接后,按照提示填写表单、上传图片即可,界面如下:
开发者按照表单提示逐个填写即可,填写完毕后,点击“保存”按钮,即可进行效果预览;确认数据没问题,点击“发布”按钮,即可自动将下载页面同步到CDN服务器上。
发行链接
发行链接是最终生成的应用下载页面地址(例如 https://m3w.cn/uniapp),生成规则为:
https://m3w.cn/ + 链接类型后缀+自定义后缀
目前支持三种类型的链接类型:
- appid/domain:当前应用的appid,若为wap2app应用,则为主域名;
- 应用名称简拼:应用名称首字母组合
- 应用名称全拼:应用名称全拼组合
自定义后缀是可选的,但若链接类型少于3个字符,则必须填写自定义后缀。
示例1:轻搜,C/S结构的5+ App,appid 为H50000001
选择不同的链接类型,最终的应用发行下载地址不同:
- 选择appid,则发行下载地址变为 http://m3w.cn/H50000001
- 选择应用名称简拼(qs),则发行下载地址变为http://m3w.cn/qs,此时链接类型少于3个字符,则必须增加自定义后缀,加入自定义后缀设为a,则最终发行链接变为http://m3w.cn/qsa
- 选择应用名称全拼(qingsou),则发行下载地址变为http://m3w.cn/qingsou
示例2:唯品会,wap2app项目,appid为W2Avip.com
选择不同的链接类型,最终的应用下载地址不同:
- 选择域名,则发行下载地址变为 http://m3w.cn/vip
- 选择应用名称简拼(wph),则发行下载地址变为http://m3w.cn/wph
- 选择应用名称全拼(weipinhui),则发行下载地址变为http://m3w.cn/weipinhui
Android/iOS下载地址
- 如果App已经上线应用市场,则填写App在应用市场的地址后,支持自动从应用市场同步应用简介、描述、应用截图等信息。
注:如果你不知道Appstore上自己app的下载地址,可以百度“Appstore 你的应用名称”
- 如果App尚未上线应用市场,可以将安装包上传到uniCloud提供的云存储或前端网页托管服务里,该cdn使用是免费的。
首先登录https://unicloud.dcloud.net.cn,如从未开通过uniCloud,请先开通;然后新建一个服务空间(阿里云的cdn是免费的),在左边导航选择云存储,上传文件,获得链接。
小程序码的获取方式
登录自己的小程序管理后台,可获得小程序码
App发布页已全面升级为uni-portal插件
,点击了解详情。
uni-portal插件
作为uni-admin
的插件,支持快捷部署,支持上传uniCloud静态网页托管,推荐使用。
===============================================
如下是历史文档,已关闭新注册入口。
===============================================
App/小程序开发完了,还得做一个发布页面?
PC、手机兼容不同屏幕?
iOS浏览器、Android浏览器、微信浏览器判断不同逻辑?
自己制作二维码?
如果小程序有多个版本,微信、支付宝、百度、QQ、快应用,那搞起来。。。
别急,有了DCloud发布平台,一切迎刃而解。无需编程,填写表单直接生成发布页!
先睹为快,通过手机或PC浏览器,访问 https://m3w.cn/uniapp ,体验hello uni-app的发行下载页面。
注意:鉴于相关部门的监管政策,使用“制作发行页面”功能之前,会提示开发者先完成身份认证,详细认证流程参考DCloud 开发者实名认证流程。
产品特征
制作App发布页面,是DCloud公司为开发者提供的一项福利,通过简单的表单配置,即可在线生成App下载页。
该产品该具备如下特点:
- 免开发:简单配置直接发布,省人力
- 响应式:兼容PC/手机浏览器,自动识别Android、iOS、微信内置浏览器
- 短地址:下载页面地址类似 https://m3w.cn/uniapp ,好记、易传播
- 功能全:支持iOS、Android App和小程序的统一发布
- 云加速:发布后自动同步CDN,降低访问延迟,提升服务可用性
- 免费!免费!免费!
制作方法
目前开发者可以通过两个入口制作App发布页面:
- 在HBuilderX中,选择一个uni-app/5+/wap2app项目,在顶部菜单中点击“发行 —> 生成统一发布页面”
- 登录dev开发者中心,在应用列表界面,选择需要发布的应用,点击“发行”按钮
打开制作下载页面链接后,按照提示填写表单、上传图片即可,界面如下:
开发者按照表单提示逐个填写即可,填写完毕后,点击“保存”按钮,即可进行效果预览;确认数据没问题,点击“发布”按钮,即可自动将下载页面同步到CDN服务器上。
发行链接
发行链接是最终生成的应用下载页面地址(例如 https://m3w.cn/uniapp),生成规则为:
https://m3w.cn/ + 链接类型后缀+自定义后缀
目前支持三种类型的链接类型:
- appid/domain:当前应用的appid,若为wap2app应用,则为主域名;
- 应用名称简拼:应用名称首字母组合
- 应用名称全拼:应用名称全拼组合
自定义后缀是可选的,但若链接类型少于3个字符,则必须填写自定义后缀。
示例1:轻搜,C/S结构的5+ App,appid 为H50000001
选择不同的链接类型,最终的应用发行下载地址不同:
- 选择appid,则发行下载地址变为 http://m3w.cn/H50000001
- 选择应用名称简拼(qs),则发行下载地址变为http://m3w.cn/qs,此时链接类型少于3个字符,则必须增加自定义后缀,加入自定义后缀设为a,则最终发行链接变为http://m3w.cn/qsa
- 选择应用名称全拼(qingsou),则发行下载地址变为http://m3w.cn/qingsou
示例2:唯品会,wap2app项目,appid为W2Avip.com
选择不同的链接类型,最终的应用下载地址不同:
- 选择域名,则发行下载地址变为 http://m3w.cn/vip
- 选择应用名称简拼(wph),则发行下载地址变为http://m3w.cn/wph
- 选择应用名称全拼(weipinhui),则发行下载地址变为http://m3w.cn/weipinhui
Android/iOS下载地址
- 如果App已经上线应用市场,则填写App在应用市场的地址后,支持自动从应用市场同步应用简介、描述、应用截图等信息。
注:如果你不知道Appstore上自己app的下载地址,可以百度“Appstore 你的应用名称”
- 如果App尚未上线应用市场,可以将安装包上传到uniCloud提供的云存储或前端网页托管服务里,该cdn使用是免费的。
首先登录https://unicloud.dcloud.net.cn,如从未开通过uniCloud,请先开通;然后新建一个服务空间(阿里云的cdn是免费的),在左边导航选择云存储,上传文件,获得链接。
小程序码的获取方式
登录自己的小程序管理后台,可获得小程序码
收起阅读 »
mui中的本地语音转文字,而不用讯飞的,使用百度的。
mui中的本地语音转文字,而不用讯飞的,使用百度的。很多人都是用讯飞的语音识别来语音转中文,要是遇到录制好了的语音要如何转中文呢?,我现在就来教教大家使用百度转:
1.先上百度语音开发者申请账号,地址:http://ai.baidu.com/;
- 所需要的api文档地址是:http://ai.baidu.com/docs#/ASR-API/top
- 先获取token,然后用token以及语音的中的时长去识别,如果要获取本地时长的话
plus.io.resolveLocalFileSystemURL(path, function(entry){
entry.file(function(file){
len = file.size;})});
附加我测试的demo:
下面下载,自己补全mui.js
by:转载请注明地址
mui中的本地语音转文字,而不用讯飞的,使用百度的。很多人都是用讯飞的语音识别来语音转中文,要是遇到录制好了的语音要如何转中文呢?,我现在就来教教大家使用百度转:
1.先上百度语音开发者申请账号,地址:http://ai.baidu.com/;
- 所需要的api文档地址是:http://ai.baidu.com/docs#/ASR-API/top
- 先获取token,然后用token以及语音的中的时长去识别,如果要获取本地时长的话
plus.io.resolveLocalFileSystemURL(path, function(entry){
entry.file(function(file){
len = file.size;})});
附加我测试的demo:
下面下载,自己补全mui.js
by:转载请注明地址
收起阅读 »
android遍历短信/读取短信
我本机华为meta8通过以下代码是可以遍历所有短息内容的。
var Uri = plus.android.importClass("android.net.Uri");
var ContactsContract = plus.android.importClass('android.provider.ContactsContract');
var uri = Uri.parse("content://sms/");
var cr = main.getContentResolver();
plus.android.importClass(cr);
var cur = cr.query(uri, null, null, null, null);
plus.android.importClass(cur);
cur.moveToFirst();
while(cur.moveToNext()) {
var index_Address = cur.getColumnIndex("address");
var address = cur.getString(index_Address);
//短信内容
var index_Body = cur.getColumnIndex("body");
var body = cur.getString(index_Body);
//类型1接收 2发送
var index_Type = cur.getColumnIndex("type");
}
cur.close();
希望对大家有帮助!
我本机华为meta8通过以下代码是可以遍历所有短息内容的。
var Uri = plus.android.importClass("android.net.Uri");
var ContactsContract = plus.android.importClass('android.provider.ContactsContract');
var uri = Uri.parse("content://sms/");
var cr = main.getContentResolver();
plus.android.importClass(cr);
var cur = cr.query(uri, null, null, null, null);
plus.android.importClass(cur);
cur.moveToFirst();
while(cur.moveToNext()) {
var index_Address = cur.getColumnIndex("address");
var address = cur.getString(index_Address);
//短信内容
var index_Body = cur.getColumnIndex("body");
var body = cur.getString(index_Body);
//类型1接收 2发送
var index_Type = cur.getColumnIndex("type");
}
cur.close();
希望对大家有帮助!
收起阅读 »
视频增强(全屏播放、拖动进度、控制声音等) - wap2app教程
增强功能
wap2app增强了HTML5视频播放功能,在全屏播放界面,增加了如下控制功能:
- 点击全屏按钮,实现横屏播放;
- 横向拖动:改变视频播放进度
- 左侧纵向拖动:改变视频亮度
- 右侧纵向拖动:改变播放声音
配置说明
wap2app默认已集成了如上的增强功能,开发者无需配置。
全屏时是否根据手势改变进度的功能,wap2app提供sitemap配置,开发者可根据需求是否启用,默认为true。
手势功能在sitmap.json里面进行如下配置(在global节点下配置,应用所有的webview均生效;在指定的webview里面配置,只在该webview里面生效):
"easyConfig":{
"video":{
"controls":false /*关闭手势拖动功能,默认为true*/
}
}
注意
- 手势拖动功能仅在HBuilder-alpha版打包的安卓应用生效,正式版下个版本更新生效。
- 如果是使用的h5默认的video元素进行全屏播放,点击video默认的全屏按钮控件,那么可能导致全屏时,手势功能生效但改变的进度无法显示,建议换成div全屏,网上有很多开源的h5播放器,集成一下即可。
- 如果是视频是在iframe里面,则ios可能出现全屏后不能横屏。解决办法如下:
//如果不是同源的页面,暂时无法解决
//如果是同源的页面,用户需要找到iframe里面的video元素,并对其进行如下操作
var videoElem = document.querySelector('video'); //video元素
// video元素开始全屏
videoElem.addEventListener('webkitbeginfullscreen', function() {//目的是监听video的全屏事件,改变手机的横竖屏
plus.screen.lockOrientation('landscape');
});
// video元素全屏结束
videoElem.addEventListener('webkitendfullscreen', function() {
plus.screen.lockOrientation('portrait');
console.log('video元素全屏结束');
});
- 如果是视频是在iframe里面,则滑动功能不生效,暂时该问题还未解决。
- 如果原站的视屏含有拖动功能,可配置"controls":false,关闭wap2app的拖动,也对原站进行判断,在5+环境下不启用原站的滑动功能。
- 开发中发现全屏功能和拖动功能不起作用,且不是以上几点问题,那么检查wap2app版本是否大于等于3.9.4,不是的话尝试升级HBuilder-alpha最新版,确保wap2app版本大于等于3.9.4,升级完还有问题的话,可在论坛发帖提出(记得贴出测试流应用的二维码或写明网址)。
更新:5+引擎已经支持X5,如果在打包时选择X5引擎,则视频播放将被X5的原生播放接管,详见:https://ask.dcloud.net.cn/article/36806
增强功能
wap2app增强了HTML5视频播放功能,在全屏播放界面,增加了如下控制功能:
- 点击全屏按钮,实现横屏播放;
- 横向拖动:改变视频播放进度
- 左侧纵向拖动:改变视频亮度
- 右侧纵向拖动:改变播放声音
配置说明
wap2app默认已集成了如上的增强功能,开发者无需配置。
全屏时是否根据手势改变进度的功能,wap2app提供sitemap配置,开发者可根据需求是否启用,默认为true。
手势功能在sitmap.json里面进行如下配置(在global节点下配置,应用所有的webview均生效;在指定的webview里面配置,只在该webview里面生效):
"easyConfig":{
"video":{
"controls":false /*关闭手势拖动功能,默认为true*/
}
}
注意
- 手势拖动功能仅在HBuilder-alpha版打包的安卓应用生效,正式版下个版本更新生效。
- 如果是使用的h5默认的video元素进行全屏播放,点击video默认的全屏按钮控件,那么可能导致全屏时,手势功能生效但改变的进度无法显示,建议换成div全屏,网上有很多开源的h5播放器,集成一下即可。
- 如果是视频是在iframe里面,则ios可能出现全屏后不能横屏。解决办法如下:
//如果不是同源的页面,暂时无法解决
//如果是同源的页面,用户需要找到iframe里面的video元素,并对其进行如下操作
var videoElem = document.querySelector('video'); //video元素
// video元素开始全屏
videoElem.addEventListener('webkitbeginfullscreen', function() {//目的是监听video的全屏事件,改变手机的横竖屏
plus.screen.lockOrientation('landscape');
});
// video元素全屏结束
videoElem.addEventListener('webkitendfullscreen', function() {
plus.screen.lockOrientation('portrait');
console.log('video元素全屏结束');
});
- 如果是视频是在iframe里面,则滑动功能不生效,暂时该问题还未解决。
- 如果原站的视屏含有拖动功能,可配置"controls":false,关闭wap2app的拖动,也对原站进行判断,在5+环境下不启用原站的滑动功能。
- 开发中发现全屏功能和拖动功能不起作用,且不是以上几点问题,那么检查wap2app版本是否大于等于3.9.4,不是的话尝试升级HBuilder-alpha最新版,确保wap2app版本大于等于3.9.4,升级完还有问题的话,可在论坛发帖提出(记得贴出测试流应用的二维码或写明网址)。
更新:5+引擎已经支持X5,如果在打包时选择X5引擎,则视频播放将被X5的原生播放接管,详见:https://ask.dcloud.net.cn/article/36806
收起阅读 »
类似美团底部栏实现
程序基础框架:base.html
<body>
<div class="mui-content">
<div id="output"></div>
</div>
<footer class="mui-bar-footer mui-hidden" id="footer">
<nav class="mui-bar mui-bar-tab">
<a class="mui-tab-item mui-active" id="home" href="javascript:;" pageurl="./template/home/home.html">
<span class="mui-icon mui-icon-home"></span>
<span class="mui-tab-label">首页</span>
</a>
<a class="mui-tab-item" id="user" href="javascript:;" pageurl="./template/user/user.html">
<span class="mui-icon mui-icon-contact"></span>
<span class="mui-tab-label">我的</span>
</a>
<a class="mui-tab-item" id="more" href="javascript:;" pageurl="./template/more/more.html">
<span class="mui-icon mui-icon-more"></span>
<span class="mui-tab-label">更多</span>
</a>
</nav>
</footer>
<script type="text/javascript" src="base.js"></script>
</body>
脚本:base.js
var _preloadPages = Array();
var arr = mui('.mui-bar-footer a');
for(var i=0;i<arr.length;i++){
var pageurl = arr[i].getAttribute('pageurl');
var pageid = arr[i].getAttribute('id');
_preloadPages.push({
url:pageurl,
id:pageid,
styles:{
top:'0',
bottom:'50px'
}
});
};
mui.init({preloadPages:_preloadPages,keyEventBind:{backbutton: true}});
mui('.mui-bar-footer').on('tap','a',function(){
var jmp_id= this.getAttribute('id');
mui.openWindow({
id:jmp_id
});
});
mui.later(function(){
mui.openWindow({
id:'home'
});
document.getElementById("footer").classList.remove("mui-hidden");
},1000);
2级页面底部条按钮:home.html user.html more.html
2级页面必须禁止返回键(包含以下代码),每个按钮对应一个webview
<script type="text/javascript">
mui.init({
keyEventBind: {
backbutton: false //关闭back按键监听
}
});
</script>
3级页面底部条按钮比如:home.html 的a标签跳转的到页面
3级页面必须不用禁止返回键(包含以下代码)
<script type="text/javascript">
mui.init();
</script>
除了base.html 必须固定格式外,其他页面通通用<a href="3级页面.html" >
实现跳转
程序基础框架:base.html
<body>
<div class="mui-content">
<div id="output"></div>
</div>
<footer class="mui-bar-footer mui-hidden" id="footer">
<nav class="mui-bar mui-bar-tab">
<a class="mui-tab-item mui-active" id="home" href="javascript:;" pageurl="./template/home/home.html">
<span class="mui-icon mui-icon-home"></span>
<span class="mui-tab-label">首页</span>
</a>
<a class="mui-tab-item" id="user" href="javascript:;" pageurl="./template/user/user.html">
<span class="mui-icon mui-icon-contact"></span>
<span class="mui-tab-label">我的</span>
</a>
<a class="mui-tab-item" id="more" href="javascript:;" pageurl="./template/more/more.html">
<span class="mui-icon mui-icon-more"></span>
<span class="mui-tab-label">更多</span>
</a>
</nav>
</footer>
<script type="text/javascript" src="base.js"></script>
</body>
脚本:base.js
var _preloadPages = Array();
var arr = mui('.mui-bar-footer a');
for(var i=0;i<arr.length;i++){
var pageurl = arr[i].getAttribute('pageurl');
var pageid = arr[i].getAttribute('id');
_preloadPages.push({
url:pageurl,
id:pageid,
styles:{
top:'0',
bottom:'50px'
}
});
};
mui.init({preloadPages:_preloadPages,keyEventBind:{backbutton: true}});
mui('.mui-bar-footer').on('tap','a',function(){
var jmp_id= this.getAttribute('id');
mui.openWindow({
id:jmp_id
});
});
mui.later(function(){
mui.openWindow({
id:'home'
});
document.getElementById("footer").classList.remove("mui-hidden");
},1000);
2级页面底部条按钮:home.html user.html more.html
2级页面必须禁止返回键(包含以下代码),每个按钮对应一个webview
<script type="text/javascript">
mui.init({
keyEventBind: {
backbutton: false //关闭back按键监听
}
});
</script>
3级页面底部条按钮比如:home.html 的a标签跳转的到页面
3级页面必须不用禁止返回键(包含以下代码)
<script type="text/javascript">
mui.init();
</script>
除了base.html 必须固定格式外,其他页面通通用<a href="3级页面.html" >
实现跳转

mui.openWindow新页面无法获取焦点
页面A
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link href="../css/mui.min.css" rel="stylesheet" />
<style>
</style>
<script src="../js/mui.min.js"></script>
<script type="text/javascript">
mui.init();
mui.plusReady(function() {
document.getElementById("btn").addEventListener("tap", function(e) {
mui.openWindow({
url: 'test2.html',
id: 'test1'
});
}, false);
});
</script>
</head>
<body>test1
<button id="btn">OPEN</button>
</body>
</html>
页面B
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link href="../css/mui.min.css" rel="stylesheet" />
<style>
</style>
<script src="../js/mui.min.js"></script>
<script type="text/javascript">
mui.init();
mui.plusReady(function() {
document.getElementById("txt").focus();
});
</script>
</head>
<body>test2
<input type="text" id="txt" />
</body>
</html>
页面A点击打开页面B,B页面无法获取焦点,如果直接打开页面B可以获取焦点
页面A
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link href="../css/mui.min.css" rel="stylesheet" />
<style>
</style>
<script src="../js/mui.min.js"></script>
<script type="text/javascript">
mui.init();
mui.plusReady(function() {
document.getElementById("btn").addEventListener("tap", function(e) {
mui.openWindow({
url: 'test2.html',
id: 'test1'
});
}, false);
});
</script>
</head>
<body>test1
<button id="btn">OPEN</button>
</body>
</html>
页面B
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link href="../css/mui.min.css" rel="stylesheet" />
<style>
</style>
<script src="../js/mui.min.js"></script>
<script type="text/javascript">
mui.init();
mui.plusReady(function() {
document.getElementById("txt").focus();
});
</script>
</head>
<body>test2
<input type="text" id="txt" />
</body>
</html>
页面A点击打开页面B,B页面无法获取焦点,如果直接打开页面B可以获取焦点
收起阅读 »
关于HBuilder的问题提起
第一次注册的时候可能因为服务器的原因发送邮件比较缓慢所以需要等比较久的时间,我等了10多分钟,
第一次注册的时候可能因为服务器的原因发送邮件比较缓慢所以需要等比较久的时间,我等了10多分钟,

mui + react的组件化开发
原文地址:http://www.jianshu.com/p/5698c0edb307
原文地址:http://www.jianshu.com/p/5698c0edb307

wap2app 打包教程
需求明确
此教程适用于利用 HBuilder 云打包 - 打原生安装包(apk/ipa)的用户。
详细步骤
Android
- 需要证书,HBuilder云端打包默认证书是DCloud的公用证书,可以直接用这个证书,也可以使用自有证书,两者不影响安装包的发布,唯一的差别就是证书中开发者和企业信息不同。关于公用证书的信息,请参考Android打包证书; 关于使用自有证书打包,请参考生成Android签名证书
- 需要注意 manifest.json 中的应用信息是否填写正确。如果填写的有问题,打包按钮是会被禁用的。
- 配置打包信息,App包名是必填项,建议使用反向域名风格的字符串,如“com.domainname.appname”。记住这个包名,如果需要实现第三方业务比如个推,地图定位,分享,支付之类会需要你在开发者平台中填写包名。注意:wap2app中如果首页有适配到css,也就是根目录下appid + 'append.css'文件是有内容的,需要在manifest.json中配置 “解压资源后运行”打包之后才会提前注入该css文件,默认是“不解压直接运行”,如下图所示
- 查看打包状态,菜单栏上发行 -> 查看打包状态,打开“查看App打包状态”对话框,可查看打包历史记录和状态
- 下载安装包,在“查看App打包状态”对话框中 “打开下载目录”可查看并下载安装包
- 安装到手机上,有很多手机和电脑的同步工具比如360手机助手,Android文件传输等等。
iOS
iOS打包分为两种:越狱包 和 使用苹果证书 打包。
越狱包
只能安装在已越狱的设备上,只需填写AppID,即可打包。
使用苹果证书打包
可通过iDP证书打包提交到Appstore发布、或通过iEP证书打包在企业内部发布,请点击查看关于iDP和iEP的区别以及如何安装ipa包到手机上
点击菜单栏 发行 -> 打原生安装包,切换到ios ,使用自有证书打包,你会看到如下信息需要你填写,详细说明如下:
- AppID:iOS应用标识,推荐使用反向域名风格的字符串,如“com.domainname.appname”,必须与profile文件绑定的App ID匹配。
- 私钥证书:iOS Certificates文件(.p12);
- 私钥密码:导入私钥证书的密码;
- Profile文件:iOS Provisioning Profile文件(.mobileprovision),必须与苹果App ID和私钥证书区配;
步骤如下:
- 首先得申请证书,需要 profile(.mobileprovision)文件 和 私钥证书(.p12),详细申请证书教程可参考iOS证书(.p12)和描述文件(.mobileprovision)申请
- 配置打包信息,在上一步操作中你可以申请到开发(Development)证书和发布(Distribution)证书以及配套的描述文件,所以此时你可以打出测试包和正式包。两者的区别就是通过iTools安装到手机时,测试包能安装成功,正式包不行。当然,如果你需要在提交审核前测试正式包的话,也可以上传到appsotre上然后通过 testFlight 测试。
- 查看打包状态。菜单栏上发行 -> 查看打包状态,打开“查看App打包状态”对话框,可查看打包历史记录和状态
- 下载安装包,与 Android 的一样
- 安装到手机上,请点击查看如何安装ipa包到手机上
补充说明
- 真机运行时涉及第三方业务比如地图定位,分享,支付默认是支持的,但是打包成原生安装包时,因为需要绑定包名,所以需开发者到相应的开发者平台申请。
- 常见错误请参考App云端打包失败常见问题汇总。
需求明确
此教程适用于利用 HBuilder 云打包 - 打原生安装包(apk/ipa)的用户。
详细步骤
Android
- 需要证书,HBuilder云端打包默认证书是DCloud的公用证书,可以直接用这个证书,也可以使用自有证书,两者不影响安装包的发布,唯一的差别就是证书中开发者和企业信息不同。关于公用证书的信息,请参考Android打包证书; 关于使用自有证书打包,请参考生成Android签名证书
- 需要注意 manifest.json 中的应用信息是否填写正确。如果填写的有问题,打包按钮是会被禁用的。
- 配置打包信息,App包名是必填项,建议使用反向域名风格的字符串,如“com.domainname.appname”。记住这个包名,如果需要实现第三方业务比如个推,地图定位,分享,支付之类会需要你在开发者平台中填写包名。注意:wap2app中如果首页有适配到css,也就是根目录下appid + 'append.css'文件是有内容的,需要在manifest.json中配置 “解压资源后运行”打包之后才会提前注入该css文件,默认是“不解压直接运行”,如下图所示
- 查看打包状态,菜单栏上发行 -> 查看打包状态,打开“查看App打包状态”对话框,可查看打包历史记录和状态
- 下载安装包,在“查看App打包状态”对话框中 “打开下载目录”可查看并下载安装包
- 安装到手机上,有很多手机和电脑的同步工具比如360手机助手,Android文件传输等等。
iOS
iOS打包分为两种:越狱包 和 使用苹果证书 打包。
越狱包
只能安装在已越狱的设备上,只需填写AppID,即可打包。
使用苹果证书打包
可通过iDP证书打包提交到Appstore发布、或通过iEP证书打包在企业内部发布,请点击查看关于iDP和iEP的区别以及如何安装ipa包到手机上
点击菜单栏 发行 -> 打原生安装包,切换到ios ,使用自有证书打包,你会看到如下信息需要你填写,详细说明如下:
- AppID:iOS应用标识,推荐使用反向域名风格的字符串,如“com.domainname.appname”,必须与profile文件绑定的App ID匹配。
- 私钥证书:iOS Certificates文件(.p12);
- 私钥密码:导入私钥证书的密码;
- Profile文件:iOS Provisioning Profile文件(.mobileprovision),必须与苹果App ID和私钥证书区配;
步骤如下:
- 首先得申请证书,需要 profile(.mobileprovision)文件 和 私钥证书(.p12),详细申请证书教程可参考iOS证书(.p12)和描述文件(.mobileprovision)申请
- 配置打包信息,在上一步操作中你可以申请到开发(Development)证书和发布(Distribution)证书以及配套的描述文件,所以此时你可以打出测试包和正式包。两者的区别就是通过iTools安装到手机时,测试包能安装成功,正式包不行。当然,如果你需要在提交审核前测试正式包的话,也可以上传到appsotre上然后通过 testFlight 测试。
- 查看打包状态。菜单栏上发行 -> 查看打包状态,打开“查看App打包状态”对话框,可查看打包历史记录和状态
- 下载安装包,与 Android 的一样
- 安装到手机上,请点击查看如何安装ipa包到手机上
补充说明
- 真机运行时涉及第三方业务比如地图定位,分享,支付默认是支持的,但是打包成原生安装包时,因为需要绑定包名,所以需开发者到相应的开发者平台申请。
- 常见错误请参考App云端打包失败常见问题汇总。

【重要】iOS平台HBuilder8.8.6真机无法运行的处理方法
非常抱歉,由于我们内部工作失误,没有及时更新iOS平台的调试基座打包证书,导致从2017.11.22下午开始,HBuilder8.8.6的iOS平台无法真机运行。
11月22日晚HBuilder已发布紧急更新本(8.8.7),已解决该问题
大家可以升级到最新版HBuilder。
如果不想升级8.8.7,以下是临时解决方案:
- 从这里下载HBuilder调试基座
- 替换HBuilder真机调试安装包目录下的iPhone_base.ipa文件
路径为“%HBuilder%\plugins\com.pandora.tools.android_1.0.0.201711151411\base\”,其中%HBuilder%为HBuilder安装根目录,“com.pandora.tools.android_1.0.0.201711151411”为调试安装包文件夹,后面数字是版本号,如果不存在此文件夹,找到最新的版本号的文件夹即可。
注意:文件名称必须是“iPhone_base.ipa”。 - 删除手机上的HBuilder应用
- 重新真机运行
给开发者带来不便,深表歉意。
非常抱歉,由于我们内部工作失误,没有及时更新iOS平台的调试基座打包证书,导致从2017.11.22下午开始,HBuilder8.8.6的iOS平台无法真机运行。
11月22日晚HBuilder已发布紧急更新本(8.8.7),已解决该问题
大家可以升级到最新版HBuilder。
如果不想升级8.8.7,以下是临时解决方案:
- 从这里下载HBuilder调试基座
- 替换HBuilder真机调试安装包目录下的iPhone_base.ipa文件
路径为“%HBuilder%\plugins\com.pandora.tools.android_1.0.0.201711151411\base\”,其中%HBuilder%为HBuilder安装根目录,“com.pandora.tools.android_1.0.0.201711151411”为调试安装包文件夹,后面数字是版本号,如果不存在此文件夹,找到最新的版本号的文件夹即可。
注意:文件名称必须是“iPhone_base.ipa”。 - 删除手机上的HBuilder应用
- 重新真机运行
给开发者带来不便,深表歉意。
收起阅读 »