
DCloud广告联盟上线,快来把你的App流量变成现金【本文已过期】
> 更新:DCloud已经推出新版uni-AD广告联盟,本文已过期。请查看新版系统:https://uniad.dcloud.net.cn/
很多开发者都有变现需求,变现也能够促使开发者有动力做更好的App。
但大多数开发者的app日活较低,面对广告主没有议价能力,申请广告SDK也容易被广告联盟拒绝。
DCloud整合了众多开发者的流量,面向广告主和广告联盟SDK厂商谈判,拿到了更好的价格,并开放给开发者。
如果你是个人开发者,努力做一个日活上千的App或小游戏,每月增加收入上千,何乐而不为?
如果你是企业的成本部门,多些创收机会也能减轻成本压力。
如果你是开发商的一名工程师,老板财大气粗不在意广告收入,为何不把广告佣金分出一半用于工程师团队的奖金呢?
如果你之前用过H5的网盟广告,那样式太丑、变现效率也太低,赶紧改用DCloud提供的原生广告吧。
你也不用担心广告的体验,DCloud同样重视广告的体验,我们的广告主也重视广告的体验,我们对接的都是国内知名的广告主(如京东、携程)和知名的广告联盟公司。
开屏广告样例:
开屏广告是很常见的广告形式。

开屏广告不是整屏广告,屏幕底部仍然是app自己的信息,往上是广告区。
底部app信息支持在manifest配置个性化图片,不配的话默认是app的icon+名称。(具体见http://ask.dcloud.net.cn/article/94
manifest文档里的plus下面的splashscreen下面的ads节点)
开发者不必担心广告会影响用户对自己的第一印象。平台默认策略是用户第一次使用该app时不会展示广告,第二次启动app才会出现广告。
当然这有可能影响广告的收益,后续DCloud会提供配置用于平衡。
没有广告主投放开屏时,app仍然显示自己的splash。
开通开屏广告需要HBuilder9.0.2版及以上。
悬浮红包广告样例:
给你的用户红包,天天抽奖送福利
悬浮红包是广告界的新宠,这个子行业叫做互动广告。不同于生硬的展示广告,抽红包通过福利、限制每日抽奖次数、多变的抽奖方式,增加了趣味性,把广告、游戏、福利融为一体,成为可以玩的广告。
在实际业务测试时抽红包取得更好的数据表现,其次日留存达到了25%,作为广告,可能比不少App的留存率还高。
很多亿级用户量的App变现,都开始使用抽红包模式,包括360手机卫士、天气通(可另行下载体验)。
根据这段时间DCloud的数据统计,悬浮红包是变现率最高的广告表达方式,想要更多收益一定要开通悬浮红包。
push广告样例:
虽然有些手机用户有推送洁癖,但数据表明,在三四线城市存在大量无聊的网民每天点各种push。
如果你的app不是面向精英效率人士的,那么开通push也是获取收益的不错选择。
实际App接入推广广告时,会根据用户画像给予不同的推送,并不是固定的红包推送。并且实际推送并不是每次App启动都推送。
为了不对用户产生过多干扰,默认推送策略是一个手机用户一周最多收到3条推送。
该策略后续会开放,允许开发者自行定义。
推送广告在安卓手机上的图标,一般都是我们单独分配的广告图标,不是开发者的App的图标,在消息栏上看不出是开发者的App在推送。
- 更多广告陆续接通中,包括信息流广告、内嵌(非悬浮)红包互动广告。
可以下载广告演示示例app,真实体验广告接入后的效果。为体验方便,该示例App没有每周3条的推送限制。
开通步骤
开通广告平台需使用HBuilder最新的9.0版正式版或alpha版。
- 使用HBuilder最新版云打包时,在界面上可以选择是否配置广告以及更多广告设置的链接,会打开开发者中心网站。
- 或自行登录开发者中心,点击左侧广告联盟,选择开通。开通广告联盟必须实名认证,也需要填写自己的收款账户,这样广告佣金才能支付到你的账户中。
开关均在云端,无需重新打包。
但2018年以前打的包,一直未更新,则需要重新打。
广告业务的开通与关闭,在都是开发者中心操作,都需要DCloud人工审核,审核周期一般0-2个工作日。
但广告位参数、上架应用商店审核需要临时隐藏广告,这些调整无需审核,云端操作实时生效。
在开通广告联盟会员时,有一份电子协议,里面描述了关于广告佣金计算、提现等细节,请开发者认真阅读。
离线打包也已更新支持广告平台,详见文档中心-5+SDK-离线打包。
如果对广告还有什么想咨询的,或者想研究如何最大化收益方式的,欢迎联系我们的商务同学bd@dcloud.io。
FAQ
1、广告收益的高低与什么有关?
- 你的app日活越高,广告收益越高。注意老版不支持广告的日活没有用,需要督促手机用户升级到新版。
- 开通的广告表达方式越多,广告收益越高。push、悬浮红包、开屏都开通,肯定比只开通push赚的多。
- 你的app与广告主的匹配度越高,你的收益越高。
比如大众点评最近在推广黑珍珠餐厅榜单,你如果恰好有一个菜谱应用,在其中展示大众点评的广告,就能赚取到较高收益。精准匹配的广告arpu可能做到平均水平的30倍。 - 你的app需要必要的权限:位置、通知栏、桌面快捷方式、本机app列表读取
拥有较多的权限,才能拿到设备数据,进而精准的给用户推荐适合的广告主。 - DCloud广告联盟的收益,一般在cpm(千次展示)几元到十几元不等,与上面提到的开通方式、匹配度、权限有关。
举个例子,假使一个日活1万的app只开通开屏广告,一般日活用户的日均app启动次数是3次,那么这个app每日启动大约3万次,也就是有3万次开屏曝光。按千次展示cpm4元计算,每天有120元佣金,一个月3600元。
如果把悬浮红包、push都加上,月收入能接近万元。
如果你是个人开发者,毋庸置疑要赚这笔钱。
如果你是企业的一名工程师,有时会遇到老板不在意这笔钱的情况,那么如果老板真的不缺钱的话,为什么不给你多涨薪呢?^_^
建议和老板谈谈,开通广告,分出一般广告佣金来做工程师团队的奖金,这样大家多赢。
2、广告收入的账期是多久
每月结算上个月的广告收益。具体见联盟注册时的授权协议。
3、广告的计费模式是什么样的,cpm、cpc、cpd、cpa、cps?
由于是广告平台,广告主投放什么样的模式都是有的,有按展示、按点击、按下载、按激活、按注册、按成交都有。广告主给DCloud提交广告、设定计费模式,DCloud根据用户画像分发广告,并优先推荐竞价高的广告主。
开发者切不可推测广告主是按点击付费,就刷点击,还是要匹配到真实需求里,给广告主创建价值,形成健康循环生态。
4、相当于其他广告平台,DCloud广告平台有什么优势?
- DCloud广告联盟的体验更好、比h5网盟广告收益更高。三方的广告SDK无法和5+App原生化融合。比如开屏、信息流等很多广告形式,只有DCloud才能完美和App内容融合,提供原生化广告。相比于飘banner、应用推荐下载的积分墙等体验不佳的广告,原生化广告的体验和变现收益好过数倍。
- 大型广告平台,如百度腾讯360等,都对App的用户量有要求,日活不过50万,很难申请通过。如果走H5网盟,对于c/s的App而言会进入作弊名单、对于wap2app的App而言,因为广告的体验不佳,不能原生化,开屏、push也都做不了,所以变现效率不如DCloud广告联盟。
- DCloud的流应用比下载原生App有更高的导流效率。广告主投放原生App时,因为下载安装的步骤长,很容易折损。DCloud的流应用技术帮助广告主大幅降低折损,秒开应用。广告主的收益更高,其愿意支付的广告佣金也越多。
5、我的App是有属性的,是否可只投放匹配该属性的广告者。
广告平台是根据广告主的意向分配广告的,在筛选数据时载体App的属性只是一个数据项,主要还是看这个设备的imei在广告平台本身的画像。
比如你的app是教育类app,但某个手机设备使用你的app时,广告平台可能发现这个设备是一个年轻女性用户,就可能匹配时尚电商的广告。
单一匹配教育类相关的广告主,很可能会轮空广告位,无法保障变现效果最大化。
app开发者可以放心把广告匹配对接交给广告平台,D-AD广告平台整合了众多广告资源,有数据画像检测和用户兴趣检测能力。
6、iOS平台提交App Store审核时,能否暂时屏蔽广告显示?
可以登录http://dev.dcloud.net.cn,广告联盟-->广告应用列表,可以对iOS平台是否显示广告进行开关配置。
7、广告误开原因汇总及解决办法:
都收录在了这篇文章 http://ask.dcloud.net.cn/article/13324
遇到appid管理失误又无法联系到appid的所有者进行变更时,请向service@dcloud.io求助。
> 更新:DCloud已经推出新版uni-AD广告联盟,本文已过期。请查看新版系统:https://uniad.dcloud.net.cn/
很多开发者都有变现需求,变现也能够促使开发者有动力做更好的App。
但大多数开发者的app日活较低,面对广告主没有议价能力,申请广告SDK也容易被广告联盟拒绝。
DCloud整合了众多开发者的流量,面向广告主和广告联盟SDK厂商谈判,拿到了更好的价格,并开放给开发者。
如果你是个人开发者,努力做一个日活上千的App或小游戏,每月增加收入上千,何乐而不为?
如果你是企业的成本部门,多些创收机会也能减轻成本压力。
如果你是开发商的一名工程师,老板财大气粗不在意广告收入,为何不把广告佣金分出一半用于工程师团队的奖金呢?
如果你之前用过H5的网盟广告,那样式太丑、变现效率也太低,赶紧改用DCloud提供的原生广告吧。
你也不用担心广告的体验,DCloud同样重视广告的体验,我们的广告主也重视广告的体验,我们对接的都是国内知名的广告主(如京东、携程)和知名的广告联盟公司。
开屏广告样例:
开屏广告是很常见的广告形式。
开屏广告不是整屏广告,屏幕底部仍然是app自己的信息,往上是广告区。
底部app信息支持在manifest配置个性化图片,不配的话默认是app的icon+名称。(具体见http://ask.dcloud.net.cn/article/94
manifest文档里的plus下面的splashscreen下面的ads节点)
开发者不必担心广告会影响用户对自己的第一印象。平台默认策略是用户第一次使用该app时不会展示广告,第二次启动app才会出现广告。
当然这有可能影响广告的收益,后续DCloud会提供配置用于平衡。
没有广告主投放开屏时,app仍然显示自己的splash。
开通开屏广告需要HBuilder9.0.2版及以上。
悬浮红包广告样例:
给你的用户红包,天天抽奖送福利
悬浮红包是广告界的新宠,这个子行业叫做互动广告。不同于生硬的展示广告,抽红包通过福利、限制每日抽奖次数、多变的抽奖方式,增加了趣味性,把广告、游戏、福利融为一体,成为可以玩的广告。
在实际业务测试时抽红包取得更好的数据表现,其次日留存达到了25%,作为广告,可能比不少App的留存率还高。
很多亿级用户量的App变现,都开始使用抽红包模式,包括360手机卫士、天气通(可另行下载体验)。
根据这段时间DCloud的数据统计,悬浮红包是变现率最高的广告表达方式,想要更多收益一定要开通悬浮红包。
push广告样例:
虽然有些手机用户有推送洁癖,但数据表明,在三四线城市存在大量无聊的网民每天点各种push。
如果你的app不是面向精英效率人士的,那么开通push也是获取收益的不错选择。
实际App接入推广广告时,会根据用户画像给予不同的推送,并不是固定的红包推送。并且实际推送并不是每次App启动都推送。
为了不对用户产生过多干扰,默认推送策略是一个手机用户一周最多收到3条推送。
该策略后续会开放,允许开发者自行定义。
推送广告在安卓手机上的图标,一般都是我们单独分配的广告图标,不是开发者的App的图标,在消息栏上看不出是开发者的App在推送。
- 更多广告陆续接通中,包括信息流广告、内嵌(非悬浮)红包互动广告。
可以下载广告演示示例app,真实体验广告接入后的效果。为体验方便,该示例App没有每周3条的推送限制。
开通步骤
开通广告平台需使用HBuilder最新的9.0版正式版或alpha版。
- 使用HBuilder最新版云打包时,在界面上可以选择是否配置广告以及更多广告设置的链接,会打开开发者中心网站。
- 或自行登录开发者中心,点击左侧广告联盟,选择开通。开通广告联盟必须实名认证,也需要填写自己的收款账户,这样广告佣金才能支付到你的账户中。
开关均在云端,无需重新打包。
但2018年以前打的包,一直未更新,则需要重新打。
广告业务的开通与关闭,在都是开发者中心操作,都需要DCloud人工审核,审核周期一般0-2个工作日。
但广告位参数、上架应用商店审核需要临时隐藏广告,这些调整无需审核,云端操作实时生效。
在开通广告联盟会员时,有一份电子协议,里面描述了关于广告佣金计算、提现等细节,请开发者认真阅读。
离线打包也已更新支持广告平台,详见文档中心-5+SDK-离线打包。
如果对广告还有什么想咨询的,或者想研究如何最大化收益方式的,欢迎联系我们的商务同学bd@dcloud.io。
FAQ
1、广告收益的高低与什么有关?
- 你的app日活越高,广告收益越高。注意老版不支持广告的日活没有用,需要督促手机用户升级到新版。
- 开通的广告表达方式越多,广告收益越高。push、悬浮红包、开屏都开通,肯定比只开通push赚的多。
- 你的app与广告主的匹配度越高,你的收益越高。
比如大众点评最近在推广黑珍珠餐厅榜单,你如果恰好有一个菜谱应用,在其中展示大众点评的广告,就能赚取到较高收益。精准匹配的广告arpu可能做到平均水平的30倍。 - 你的app需要必要的权限:位置、通知栏、桌面快捷方式、本机app列表读取
拥有较多的权限,才能拿到设备数据,进而精准的给用户推荐适合的广告主。 - DCloud广告联盟的收益,一般在cpm(千次展示)几元到十几元不等,与上面提到的开通方式、匹配度、权限有关。
举个例子,假使一个日活1万的app只开通开屏广告,一般日活用户的日均app启动次数是3次,那么这个app每日启动大约3万次,也就是有3万次开屏曝光。按千次展示cpm4元计算,每天有120元佣金,一个月3600元。
如果把悬浮红包、push都加上,月收入能接近万元。
如果你是个人开发者,毋庸置疑要赚这笔钱。
如果你是企业的一名工程师,有时会遇到老板不在意这笔钱的情况,那么如果老板真的不缺钱的话,为什么不给你多涨薪呢?^_^
建议和老板谈谈,开通广告,分出一般广告佣金来做工程师团队的奖金,这样大家多赢。
2、广告收入的账期是多久
每月结算上个月的广告收益。具体见联盟注册时的授权协议。
3、广告的计费模式是什么样的,cpm、cpc、cpd、cpa、cps?
由于是广告平台,广告主投放什么样的模式都是有的,有按展示、按点击、按下载、按激活、按注册、按成交都有。广告主给DCloud提交广告、设定计费模式,DCloud根据用户画像分发广告,并优先推荐竞价高的广告主。
开发者切不可推测广告主是按点击付费,就刷点击,还是要匹配到真实需求里,给广告主创建价值,形成健康循环生态。
4、相当于其他广告平台,DCloud广告平台有什么优势?
- DCloud广告联盟的体验更好、比h5网盟广告收益更高。三方的广告SDK无法和5+App原生化融合。比如开屏、信息流等很多广告形式,只有DCloud才能完美和App内容融合,提供原生化广告。相比于飘banner、应用推荐下载的积分墙等体验不佳的广告,原生化广告的体验和变现收益好过数倍。
- 大型广告平台,如百度腾讯360等,都对App的用户量有要求,日活不过50万,很难申请通过。如果走H5网盟,对于c/s的App而言会进入作弊名单、对于wap2app的App而言,因为广告的体验不佳,不能原生化,开屏、push也都做不了,所以变现效率不如DCloud广告联盟。
- DCloud的流应用比下载原生App有更高的导流效率。广告主投放原生App时,因为下载安装的步骤长,很容易折损。DCloud的流应用技术帮助广告主大幅降低折损,秒开应用。广告主的收益更高,其愿意支付的广告佣金也越多。
5、我的App是有属性的,是否可只投放匹配该属性的广告者。
广告平台是根据广告主的意向分配广告的,在筛选数据时载体App的属性只是一个数据项,主要还是看这个设备的imei在广告平台本身的画像。
比如你的app是教育类app,但某个手机设备使用你的app时,广告平台可能发现这个设备是一个年轻女性用户,就可能匹配时尚电商的广告。
单一匹配教育类相关的广告主,很可能会轮空广告位,无法保障变现效果最大化。
app开发者可以放心把广告匹配对接交给广告平台,D-AD广告平台整合了众多广告资源,有数据画像检测和用户兴趣检测能力。
6、iOS平台提交App Store审核时,能否暂时屏蔽广告显示?
可以登录http://dev.dcloud.net.cn,广告联盟-->广告应用列表,可以对iOS平台是否显示广告进行开关配置。
7、广告误开原因汇总及解决办法:
都收录在了这篇文章 http://ask.dcloud.net.cn/article/13324
遇到appid管理失误又无法联系到appid的所有者进行变更时,请向service@dcloud.io求助。

项目涉及到本地存储分享一个自写框架 喜欢可以收藏
/*
操作规范
- index 关键字 不一定等于 数组下标
- 共有属性[date - length]
- store(db.table).insert(date) // 插入
- store(db.table).update(row,val,where) // 修改
- store(db.table).select(where) // 查询
- store(db.table).select(where).groupby(row) // 分组
- store(db.table).select(where).orderby('row desc || asc') // 排序
- */
// 新增 .user 用于识别用户
store('as.day').user(val).select()
localStorage 存储数据会丢失 不明原因
所以APP环境采用plus.storage 存储
// 交流群:418967623
// 修改操作调整
store(db.table).update({
row1:val1,
row2:val2
},where)
store('as.day').insert({ a: 11,b: 22, c:{ q:'哈哈' } });
store('as.day').insert({ a: 11,b: 2, c:{ q:'哈哈' } });
store('as.day').update('a',11 + 11,'c.q is 哈哈')
store('as.day').delete('b is 2')
console.log(store('as.day').select().date,store('as.day').select().length)
console.log(store('as.day').select('b is 22').date)
console.log(store('as.day').select().groupby('b').date)
console.log(store('as.day').select().orderby('index desc').date)
/*
操作规范
- index 关键字 不一定等于 数组下标
- 共有属性[date - length]
- store(db.table).insert(date) // 插入
- store(db.table).update(row,val,where) // 修改
- store(db.table).select(where) // 查询
- store(db.table).select(where).groupby(row) // 分组
- store(db.table).select(where).orderby('row desc || asc') // 排序
- */
// 新增 .user 用于识别用户
store('as.day').user(val).select()
localStorage 存储数据会丢失 不明原因
所以APP环境采用plus.storage 存储
// 交流群:418967623
// 修改操作调整
store(db.table).update({
row1:val1,
row2:val2
},where)
store('as.day').insert({ a: 11,b: 22, c:{ q:'哈哈' } });
store('as.day').insert({ a: 11,b: 2, c:{ q:'哈哈' } });
store('as.day').update('a',11 + 11,'c.q is 哈哈')
store('as.day').delete('b is 2')
console.log(store('as.day').select().date,store('as.day').select().length)
console.log(store('as.day').select('b is 22').date)
console.log(store('as.day').select().groupby('b').date)
console.log(store('as.day').select().orderby('index desc').date)
收起阅读 »

分享Android端判断锁屏和熄屏的代码
/**
* 判断是否手机亮屏
* @returns {boolean}
*/
static isScreenOn() {
if (typeof (plus) !== 'undefined') {
var pm = plus.android.runtimeMainActivity()
.getSystemService(plus.android.android.content.Context.POWER_SERVICE);
return plus.android.invoke(pm, 'isScreenOn');
}
return true;
}
/**
* 判断手机屏幕是否锁定
* @returns {boolean}
*/
static isScreenLocked() {
if (typeof (plus) !== 'undefined') {
var pm = plus.android.runtimeMainActivity()
.getSystemService(plus.android.android.content.Context.KEYGUARD_SERVICE);
return plus.android.invoke(pm, 'inKeyguardRestrictedInputMode');
}
return false;
}
/**
* 判断是否手机亮屏
* @returns {boolean}
*/
static isScreenOn() {
if (typeof (plus) !== 'undefined') {
var pm = plus.android.runtimeMainActivity()
.getSystemService(plus.android.android.content.Context.POWER_SERVICE);
return plus.android.invoke(pm, 'isScreenOn');
}
return true;
}
/**
* 判断手机屏幕是否锁定
* @returns {boolean}
*/
static isScreenLocked() {
if (typeof (plus) !== 'undefined') {
var pm = plus.android.runtimeMainActivity()
.getSystemService(plus.android.android.content.Context.KEYGUARD_SERVICE);
return plus.android.invoke(pm, 'inKeyguardRestrictedInputMode');
}
return false;
}
收起阅读 »

分享一个小工具,用户HB编写的H5+混合APP批量制作增量包
本程序是为HBuilder 编写的HTML5+ 混合APP 差量更新所定制的一个小工具
本程序主要是针对资源版本.进行文件对比.将差异文件进行打包,制作符合HBuilder的差量更新的更新包.
使用说明:
手动制作 差量包
1.可选择自定不同两个版本.进行差量包打包
2.使用自动增量对比.须将所有旧版本资源文件放在old_ves文件夹下.选择最新版本资源包.
程序自动将差量跟新包以 "旧版本_新版本.wgtu"为名称储存在程序目录 "Pack/新版本号" 文件夹下
程序更新逻辑可为 优先下载 "当前版本_新版本.wgtu" 的增量文件.如文件不存在 下载整体资源包
本程序是为HBuilder 编写的HTML5+ 混合APP 差量更新所定制的一个小工具
本程序主要是针对资源版本.进行文件对比.将差异文件进行打包,制作符合HBuilder的差量更新的更新包.
使用说明:
手动制作 差量包
1.可选择自定不同两个版本.进行差量包打包
2.使用自动增量对比.须将所有旧版本资源文件放在old_ves文件夹下.选择最新版本资源包.
程序自动将差量跟新包以 "旧版本_新版本.wgtu"为名称储存在程序目录 "Pack/新版本号" 文件夹下
程序更新逻辑可为 优先下载 "当前版本_新版本.wgtu" 的增量文件.如文件不存在 下载整体资源包
收起阅读 »
双webview上拉加载BUG修复
MUI在没有更多数据后默认将上拉事件取消监听,这个做法本身不存在问题
但是大多情况下,上拉一般是跟下拉刷新同时存在
如果没有更多数据后客户进行下拉刷新会发现数据永远不会再加载了
以下是相关修复代码
endPullup:function(finished) {//上拉加载结束
var self = this;
if (self.pullLoading) {
self.pullLoading.classList.remove(CLASS_VISIBILITY);
self.pullLoading.classList.add(CLASS_HIDDEN);
self.isLoading = false;
if (finished) {
self.finished = true;
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_NOMORE;
self.pullCaption.innerHTML = self.options.up.contentnomore;
//取消5+的plusscrollbottom事件
document.removeEventListener('plusscrollbottom', self);
window.removeEventListener('dragup', self);
} else { //初始化时隐藏,后续不再隐藏
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_DOWN;
self.pullCaption.innerHTML = self.options.up.contentdown;
//修复代码,加上后,在相关的下拉刷新调用方法内调用mui('#pullrefresh').pullRefresh().endPullupToRefresh(false);
self.finished = false;
document.addEventListener('plusscrollbottom', self);
window.addEventListener('dragup', self);
}
}
},
MUI在没有更多数据后默认将上拉事件取消监听,这个做法本身不存在问题
但是大多情况下,上拉一般是跟下拉刷新同时存在
如果没有更多数据后客户进行下拉刷新会发现数据永远不会再加载了
以下是相关修复代码
endPullup:function(finished) {//上拉加载结束
var self = this;
if (self.pullLoading) {
self.pullLoading.classList.remove(CLASS_VISIBILITY);
self.pullLoading.classList.add(CLASS_HIDDEN);
self.isLoading = false;
if (finished) {
self.finished = true;
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_NOMORE;
self.pullCaption.innerHTML = self.options.up.contentnomore;
//取消5+的plusscrollbottom事件
document.removeEventListener('plusscrollbottom', self);
window.removeEventListener('dragup', self);
} else { //初始化时隐藏,后续不再隐藏
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_DOWN;
self.pullCaption.innerHTML = self.options.up.contentdown;
//修复代码,加上后,在相关的下拉刷新调用方法内调用mui('#pullrefresh').pullRefresh().endPullupToRefresh(false);
self.finished = false;
document.addEventListener('plusscrollbottom', self);
window.addEventListener('dragup', self);
}
}
},
收起阅读 »

【汇总】wap2app应用强化
应用强化
首页选项卡切换
http://ask.dcloud.net.cn/article/12878
升级检测
http://ask.dcloud.net.cn/article/12895
引导页
http://ask.dcloud.net.cn/article/13011
原生定位
http://ask.dcloud.net.cn/article/12767
原生分享
http://ask.dcloud.net.cn/article/12766
扫一扫
http://ask.dcloud.net.cn/article/12998
消息推送
参考 HelloW2A 示例工程 -> app.js 中的源码
http://ask.dcloud.net.cn/article/12921
http://ask.dcloud.net.cn/article/12985
自定义404页面
http://ask.dcloud.net.cn/article/73
视频全屏横屏播放
http://ask.dcloud.net.cn/article/12933
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题
应用强化
首页选项卡切换
http://ask.dcloud.net.cn/article/12878
升级检测
http://ask.dcloud.net.cn/article/12895
引导页
http://ask.dcloud.net.cn/article/13011
原生定位
http://ask.dcloud.net.cn/article/12767
原生分享
http://ask.dcloud.net.cn/article/12766
扫一扫
http://ask.dcloud.net.cn/article/12998
消息推送
参考 HelloW2A 示例工程 -> app.js 中的源码
http://ask.dcloud.net.cn/article/12921
http://ask.dcloud.net.cn/article/12985
自定义404页面
http://ask.dcloud.net.cn/article/73
视频全屏横屏播放
http://ask.dcloud.net.cn/article/12933
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题

【示例】wap2app应用中302等二次跳转的地址匹配
场景一
页面A -> 点击跳转 -> 302等地址 -> 目标地址
302地址: http://m.example.com/redirect?redirect_url=http://m.example.com/detail.html
目标地址:http://m.example.com/detail.html
为了防止出现白屏或者重复打开窗口的情况,需要在 sitemap.json -> pages 中,将302地址与目标地址匹配到一起。
{
"webviewId": "detail",
"matchUrls": [
{
"pathname": "/redirect",
"search": "R:redirect_url=.*\\/detail.html"
}, {
"pathname": "/detail.html"
}
]
}
场景一
页面A -> 点击跳转 -> 302等地址 -> 目标地址
302地址: http://m.example.com/redirect?redirect_url=http://m.example.com/detail.html
目标地址:http://m.example.com/detail.html
为了防止出现白屏或者重复打开窗口的情况,需要在 sitemap.json -> pages 中,将302地址与目标地址匹配到一起。
{
"webviewId": "detail",
"matchUrls": [
{
"pathname": "/redirect",
"search": "R:redirect_url=.*\\/detail.html"
}, {
"pathname": "/detail.html"
}
]
}
收起阅读 »

【示例】wap2app应用在iOS平台下唤醒淘宝
wap2app 应用,在 iOS 环境下唤醒淘宝等应用,需要配置两处白名单。
第一处
manifest.json -> plus -> distribute -> apple 节点下,添加 urlschemewhitelist。对应的值为数组格式,如:
{
"plus": {
"distribute": {
"apple": {
"urlschemewhitelist": [
"mqq",
"taobao"
]
}
}
}
}
第二处
同样是 manifest.json 文件 plus 节点下,添加 schemeWhitelist 节点,其对应的值也是数组格式,如:
{
"plus": {
"schemeWhitelist": [
"mqq",
"taobao"
]
}
}
注意
urlschemewhitelist 和 schemeWhitelist 所在的节点不同,注意属性名的大小写,保持这两个属性对应的值相同。
wap2app 应用,在 iOS 环境下唤醒淘宝等应用,需要配置两处白名单。
第一处
manifest.json -> plus -> distribute -> apple 节点下,添加 urlschemewhitelist。对应的值为数组格式,如:
{
"plus": {
"distribute": {
"apple": {
"urlschemewhitelist": [
"mqq",
"taobao"
]
}
}
}
}
第二处
同样是 manifest.json 文件 plus 节点下,添加 schemeWhitelist 节点,其对应的值也是数组格式,如:
{
"plus": {
"schemeWhitelist": [
"mqq",
"taobao"
]
}
}
注意
urlschemewhitelist 和 schemeWhitelist 所在的节点不同,注意属性名的大小写,保持这两个属性对应的值相同。

【汇总】wap2app常见问题
常见问题
302之类的二次跳转如何匹配防止白屏
http://ask.dcloud.net.cn/article/13074
相同规则的地址间跳转会反复打开新窗口么?
当前 webview 中跳转一个相同规则的 url,直接在当前 webview 中加载,不会重复打开新的 webview。
可以本地打包或嵌入其它应用内么?
不支持本地打包,只能通过云端打包成相应的apk/ipa。同时,也不能嵌入到其它应用中。
http://ask.dcloud.net.cn/question/48290
如何移除原生导航栏
原则上不建议移除原生导航栏,原生导航栏也是优化的比较重要的一部分。
http://ask.dcloud.net.cn/question/50018
网站引用了 mui 导致返回键操作异常
mui.js 在 5+ 环境下会处理 backbutton,wap2app 同样也会处理,因此会造成冲突。
mui 提供了关闭监听的配置,详细参考文档说明:关闭页面
mui.init({
keyEventBind: {
backbutton: false //关闭back按键监听
}
});
wap2app如何让一个链接是在同一个webview中跳转,而不是打开另外一个webview。
将目标 url 配置到一个 page 的 matchUrls。
wap2app如何返回上一页并刷新
获取目标 webview 对象,并执行刷新逻辑。
http://ask.dcloud.net.cn/question/49546
wap2app应用iOS如何唤起淘宝等第三方应用
需要配置两处白名单
http://ask.dcloud.net.cn/article/13073
wap2app原生下拉pullToRefresh怎么更新list的DOM而不是刷新网页
可以执行自定义的下拉刷新逻辑
http://ask.dcloud.net.cn/question/48490
wap2app中使用Native.js
远程的 HTML 不能使用 Native.js
http://ask.dcloud.net.cn/question/48540
退出时候的反馈如何去掉
调整首页 easyConfig -> quit 的配置即可
http://ask.dcloud.net.cn/article/12750
http://ask.dcloud.net.cn/article/13069
自定义插件以及其它第三方SDK的集成
不支持扩展
首页titleNview配置的按钮怎么添加监听事件
http://ask.dcloud.net.cn/article/12622
云打包时如何加密
云端打包时,选择“启用js原生混淆”。如果有需要,可以使用第三方,如360等提供的加固方案,进行加固。
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题
常见问题
302之类的二次跳转如何匹配防止白屏
http://ask.dcloud.net.cn/article/13074
相同规则的地址间跳转会反复打开新窗口么?
当前 webview 中跳转一个相同规则的 url,直接在当前 webview 中加载,不会重复打开新的 webview。
可以本地打包或嵌入其它应用内么?
不支持本地打包,只能通过云端打包成相应的apk/ipa。同时,也不能嵌入到其它应用中。
http://ask.dcloud.net.cn/question/48290
如何移除原生导航栏
原则上不建议移除原生导航栏,原生导航栏也是优化的比较重要的一部分。
http://ask.dcloud.net.cn/question/50018
网站引用了 mui 导致返回键操作异常
mui.js 在 5+ 环境下会处理 backbutton,wap2app 同样也会处理,因此会造成冲突。
mui 提供了关闭监听的配置,详细参考文档说明:关闭页面
mui.init({
keyEventBind: {
backbutton: false //关闭back按键监听
}
});
wap2app如何让一个链接是在同一个webview中跳转,而不是打开另外一个webview。
将目标 url 配置到一个 page 的 matchUrls。
wap2app如何返回上一页并刷新
获取目标 webview 对象,并执行刷新逻辑。
http://ask.dcloud.net.cn/question/49546
wap2app应用iOS如何唤起淘宝等第三方应用
需要配置两处白名单
http://ask.dcloud.net.cn/article/13073
wap2app原生下拉pullToRefresh怎么更新list的DOM而不是刷新网页
可以执行自定义的下拉刷新逻辑
http://ask.dcloud.net.cn/question/48490
wap2app中使用Native.js
远程的 HTML 不能使用 Native.js
http://ask.dcloud.net.cn/question/48540
退出时候的反馈如何去掉
调整首页 easyConfig -> quit 的配置即可
http://ask.dcloud.net.cn/article/12750
http://ask.dcloud.net.cn/article/13069
自定义插件以及其它第三方SDK的集成
不支持扩展
首页titleNview配置的按钮怎么添加监听事件
http://ask.dcloud.net.cn/article/12622
云打包时如何加密
云端打包时,选择“启用js原生混淆”。如果有需要,可以使用第三方,如360等提供的加固方案,进行加固。
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题

【文档】wap2app之app.js
该文章意在汇总整理 app.js 的配置,方便日常开发中查阅。
详细教程请参考 app.js - wap2app教程
App
App(appConfig);
参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
options | Object | 全局参数配置 | * | |
onLaunch | Function | 生命周期函数,监听 wap2app 应用初始化。 | wap2app 应用初始化完成时触发,全局只触发一次。 | |
onShow | Function | 生命周期函数,监听 wap2app 应用显示。 | 当 wap2app 应用从后台进入前台显示时触发。 | |
onHide | Function | 生命周期函数,监听 wap2app 应用隐藏。 | 当 wap2app 应用从前台进入后台时触发。 |
Tips
当用户按了设备 Home 键,wap2app 应用并不会立即被销毁,而是进入了后台运行。当再次打开 wap2app 应用时,会从后台进入前台。
appConfig -> options 参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
debug | Boolean | 是否输出日志,默认为 false。 | 通过 HBuilder 真机运行调试时,如果设置为 true,则在控制台输出日志信息。 |
Page
Page(id, pageConfig);
参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
id | String | webview 的 id | 该值取自 sitemap.json 中配置 page 对应的 webviewId | |
pageConfig | Object | 页面参数配置 | * |
pageConfig 参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
onShow | Function | 生命周期函数,监听 webview 的显示。 | 对应的 webview 显示时触发 | |
onClose | Function | 生命周期函数,监听 webview 的关闭。 | 对应的 webview 关闭时触发 |
运行环境
需要注意的是,以上函数中的 JavaScript 的代码,并不是在首页或者某个 webviewe 中执行。
所以当 JavaScript 代码中涉及到最某个特定 webview 中的内容进行操作时,需要获取 webview 通过 evalJS 方法来执行。
例如,从详情页返回时,希望刷新列表页。在 app.js 中,注册 detail 页面的配置。
Page('detail', {
onClose: function() {
// 刷新列表
var listWebview = plus.webview.getWebviewById('list');
if(listWebview) {
listWebview.evalJS('refresh()'); //refresh() 方法是目标窗口中全局的函数,用于刷新页面;
// 或者简单点,直接用 webview 的刷新方法;
// listWebview.reload(true);
}
}
});
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题
该文章意在汇总整理 app.js 的配置,方便日常开发中查阅。
详细教程请参考 app.js - wap2app教程
App
App(appConfig);
参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
options | Object | 全局参数配置 | * | |
onLaunch | Function | 生命周期函数,监听 wap2app 应用初始化。 | wap2app 应用初始化完成时触发,全局只触发一次。 | |
onShow | Function | 生命周期函数,监听 wap2app 应用显示。 | 当 wap2app 应用从后台进入前台显示时触发。 | |
onHide | Function | 生命周期函数,监听 wap2app 应用隐藏。 | 当 wap2app 应用从前台进入后台时触发。 |
Tips
当用户按了设备 Home 键,wap2app 应用并不会立即被销毁,而是进入了后台运行。当再次打开 wap2app 应用时,会从后台进入前台。
appConfig -> options 参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
debug | Boolean | 是否输出日志,默认为 false。 | 通过 HBuilder 真机运行调试时,如果设置为 true,则在控制台输出日志信息。 |
Page
Page(id, pageConfig);
参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
id | String | webview 的 id | 该值取自 sitemap.json 中配置 page 对应的 webviewId | |
pageConfig | Object | 页面参数配置 | * |
pageConfig 参数说明 | 参数 | 类型 | 说明 | 更多 |
---|---|---|---|---|
onShow | Function | 生命周期函数,监听 webview 的显示。 | 对应的 webview 显示时触发 | |
onClose | Function | 生命周期函数,监听 webview 的关闭。 | 对应的 webview 关闭时触发 |
运行环境
需要注意的是,以上函数中的 JavaScript 的代码,并不是在首页或者某个 webviewe 中执行。
所以当 JavaScript 代码中涉及到最某个特定 webview 中的内容进行操作时,需要获取 webview 通过 evalJS 方法来执行。
例如,从详情页返回时,希望刷新列表页。在 app.js 中,注册 detail 页面的配置。
Page('detail', {
onClose: function() {
// 刷新列表
var listWebview = plus.webview.getWebviewById('list');
if(listWebview) {
listWebview.evalJS('refresh()'); //refresh() 方法是目标窗口中全局的函数,用于刷新页面;
// 或者简单点,直接用 webview 的刷新方法;
// listWebview.reload(true);
}
}
});
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题

【文档】wap2app之sitemap.json
该文章意在汇总整理 sitemap.json 的配置,方便日常开发中查阅。
详细教程请参考 sitemap.json概述 - wap2app教程
根节点
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
global | Object | App 全局配置 | sitemap.json概述 |
pages | Array | M 站所有需要增强的页面配置 | sitemap.json概述 |
global
App 全局配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
webviewParameter | Object | webview 相关配置 | webviewParameter配置 |
easyConfig | Object | 为提升用户体验而提供的简化实现 | easyConfig配置 |
pages
页面组配置
page
sitemap.json -> pages 集合的单个页面配置对象
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
webviewId | String | 当前页面所属 webview 的 id | * |
matchUrls | Array | 页面 url 匹配规则 | matchUrls配置 |
webviewParameter | Object | webview 相关配置 | webviewParameter配置 |
easyConfig | Object | 为提升用户体验而提供的简化实现 | easyConfig配置 |
matchUrl
page -> matchUrls 集合的单个匹配规则对象
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
href | String/RegExp/Wildcard | 页面完整 url | * |
hostname | String/RegExp/Wildcard | 域名信息 | * |
pathname | String/RegExp/Wildcard | 路径信息 | * |
search | String/RegExp/Wildcard | 查询字符串信息 | * |
hash | String/RegExp/Wildcard | 锚点信息 | * |
webviewParameter
webview 相关配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
titleNView | Object | 原生标题栏样式配置 | titleNView配置 |
statusbar | Object | 系统状态栏样式配置 | * |
appendCss | String | 向服务端页面插入的 css 代码 | * |
appendJs | String | 向服务端页面插入的 JavaScript 代码 | * |
pullToRefresh | Object | 下拉刷新配置 | * |
tabBar | Object | 选项卡切换效果优化,目前仅支持首页底部选项卡 | 选项卡切换优化 |
subNViews | String | NView模板配置 | NView模板 |
statusbar
系统状态栏样式配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
style | String | 状态栏前景色(文字颜色) | * |
background | String | 状态栏背景色,默认应当与原生导航条背景色保持一致 | * |
pullToRefresh
下拉刷新配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
support | Boolean | 是否启用原生下拉刷新,默认为 false | * |
easyConfig
为提升用户体验而提供的简化实现
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
back | Object | wap2app 后退逻辑 | * |
open | Object | 打开新窗口的优化 | * |
quit | Object | wap2app 退出逻辑 | 仅支持首页 |
back
wap2app 后退逻辑
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
before | Array | 后退前的优化 | * |
history | Boolean | 是否执行 history.back() | * |
back -> before 集合的单个配置 | 属性 | 类型 | 说明 | 更多 |
---|---|---|---|---|
popupSelector | String | 弹出层选择器 | * | |
closeSelector | String | 取消按钮选择器或遮罩层选择器 | * | |
eventType | String | 事件类型,默认为 click | * |
open
打开新窗口的优化
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
animation | Object | 窗口动画配置 | * |
open -> animation 的配置 | 属性 | 类型 | 说明 | 更多 |
---|---|---|---|---|
type | String | 窗口动画类型 | 窗口显示动画效果 | |
duration | Number | 窗口动画执行时间,单位为 ms,默认 300ms | * |
quit
wap2app 退出逻辑,仅支持在首页配置。
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
toast | Object | toast 消息框配置 | * |
quit -> toast 配置 | 属性 | 类型 | 说明 | 更多 |
---|---|---|---|---|
showFeedback | Boolean | 是否显示 toast,默认为 true | * |
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题
该文章意在汇总整理 sitemap.json 的配置,方便日常开发中查阅。
详细教程请参考 sitemap.json概述 - wap2app教程
根节点
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
global | Object | App 全局配置 | sitemap.json概述 |
pages | Array | M 站所有需要增强的页面配置 | sitemap.json概述 |
global
App 全局配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
webviewParameter | Object | webview 相关配置 | webviewParameter配置 |
easyConfig | Object | 为提升用户体验而提供的简化实现 | easyConfig配置 |
pages
页面组配置
page
sitemap.json -> pages 集合的单个页面配置对象
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
webviewId | String | 当前页面所属 webview 的 id | * |
matchUrls | Array | 页面 url 匹配规则 | matchUrls配置 |
webviewParameter | Object | webview 相关配置 | webviewParameter配置 |
easyConfig | Object | 为提升用户体验而提供的简化实现 | easyConfig配置 |
matchUrl
page -> matchUrls 集合的单个匹配规则对象
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
href | String/RegExp/Wildcard | 页面完整 url | * |
hostname | String/RegExp/Wildcard | 域名信息 | * |
pathname | String/RegExp/Wildcard | 路径信息 | * |
search | String/RegExp/Wildcard | 查询字符串信息 | * |
hash | String/RegExp/Wildcard | 锚点信息 | * |
webviewParameter
webview 相关配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
titleNView | Object | 原生标题栏样式配置 | titleNView配置 |
statusbar | Object | 系统状态栏样式配置 | * |
appendCss | String | 向服务端页面插入的 css 代码 | * |
appendJs | String | 向服务端页面插入的 JavaScript 代码 | * |
pullToRefresh | Object | 下拉刷新配置 | * |
tabBar | Object | 选项卡切换效果优化,目前仅支持首页底部选项卡 | 选项卡切换优化 |
subNViews | String | NView模板配置 | NView模板 |
statusbar
系统状态栏样式配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
style | String | 状态栏前景色(文字颜色) | * |
background | String | 状态栏背景色,默认应当与原生导航条背景色保持一致 | * |
pullToRefresh
下拉刷新配置
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
support | Boolean | 是否启用原生下拉刷新,默认为 false | * |
easyConfig
为提升用户体验而提供的简化实现
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
back | Object | wap2app 后退逻辑 | * |
open | Object | 打开新窗口的优化 | * |
quit | Object | wap2app 退出逻辑 | 仅支持首页 |
back
wap2app 后退逻辑
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
before | Array | 后退前的优化 | * |
history | Boolean | 是否执行 history.back() | * |
back -> before 集合的单个配置 | 属性 | 类型 | 说明 | 更多 |
---|---|---|---|---|
popupSelector | String | 弹出层选择器 | * | |
closeSelector | String | 取消按钮选择器或遮罩层选择器 | * | |
eventType | String | 事件类型,默认为 click | * |
open
打开新窗口的优化
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
animation | Object | 窗口动画配置 | * |
open -> animation 的配置 | 属性 | 类型 | 说明 | 更多 |
---|---|---|---|---|
type | String | 窗口动画类型 | 窗口显示动画效果 | |
duration | Number | 窗口动画执行时间,单位为 ms,默认 300ms | * |
quit
wap2app 退出逻辑,仅支持在首页配置。
属性 | 类型 | 说明 | 更多 |
---|---|---|---|
toast | Object | toast 消息框配置 | * |
quit -> toast 配置 | 属性 | 类型 | 说明 | 更多 |
---|---|---|---|---|
showFeedback | Boolean | 是否显示 toast,默认为 true | * |
扩展阅读
wap2app概述(入门必读)
sitemap.json文档
app.js文档
wap2app应用强化
wap2app常见问题