
安卓studio离线打包,安装时出现签名不一致问题
1.相信有很多小伙伴离线打包,都遇到这个问题。
- 仔细一看,问题就在包名没有更换,下载的sdk包名都是com.HBuilder.integrate,但是如果你是简单在如下图xml文件更改,是不行的,
- 办法就是ctrl + shift + R 全局修改, 全局替换,搜索该包名,然后引用包名的地方全部替换,这样才可以改掉原来的包名。
- 替换成自己的包名之后,重新生成一个新的keystore。这样包名是新的,keystore也是新的。打包出来就没有签名不一致的问题了、
1.相信有很多小伙伴离线打包,都遇到这个问题。
- 仔细一看,问题就在包名没有更换,下载的sdk包名都是com.HBuilder.integrate,但是如果你是简单在如下图xml文件更改,是不行的,
- 办法就是ctrl + shift + R 全局修改, 全局替换,搜索该包名,然后引用包名的地方全部替换,这样才可以改掉原来的包名。
- 替换成自己的包名之后,重新生成一个新的keystore。这样包名是新的,keystore也是新的。打包出来就没有签名不一致的问题了、

广告误开原因汇总及解决办法
可能的原因及方案
- 网络劫持
很多悬浮球或底部悬浮banner是因为三方网络劫持发生,尤其常见于加载非https的在线url。本地HTML+ajax不存在此问题。https 的 url 也不存在。本地化或加 https 可以规避三方网络劫持。不懂什么是网络劫持的自行百度下。验证网络劫持的常用办法,是切换网络后看还有没有广告了,比如从4G换成wifi,如果不是同一个网络运营商,一般不会有相同的劫持。 - 安卓三方模拟器广告
一些三方的安卓模拟器,在运行apk后会弹他们自己的开屏广告,也令人防不胜防。
遇到过有开发者误以为这个是DCloud的开屏广告。此时要换到真机上再测试下。
尤其是使用HBuilder真机运行基座是不会有广告的,在模拟器上看到真机运行的基座也有广告,大概率是被模拟器劫持了。 - 离线打包内嵌了三方 SDK,这些 SDK 带广告。这个情况非常常见,所以一定要谨慎使用三方 SDK。
- appid 和所有者混乱
你的 appid 使用了别人的 appid,常见于复制项目时没有更改 appid,别人的 App 开了广告,导致你的 App 也跟着开广告了。尤其是很多开发者使用的 appid 是 HelloH5 或 HelloMUI,这肯定会出乱子。
还有些开发者,做了很多个项目,都使用同一个appid。此时任一app申请开广告,就会导致所有app都打开广告。
我们已经遇到几个因此发生的事故,尤其是有的app是外包公司给客户做的,影响很严重,请务必排查appid,保证appid的真实有效和独立性。 - 对于公司项目,务必注意 appid 的所有者没有离职,如若离职时及时更换所有者。默认情况下 appid 的创建者为所有者,其他人为协作者。如需查询或变更,在开发者中心 dev.dcloud.net.cn 管理。
- 务必保证使用真实有效邮箱注册 HBuilder 账户,邮箱账户注销前及时在开发者中心变更。乱填别人的邮箱也会造成 App 管理权失效。
- 检查好自己的配置,多人协作项目需要检查所有人的配置。广告开通既可以在 manifest.json 中体现,也可以云端配置是否显示。开发者中心也登录检查下。
- HBuilder工具误开广告
其实这是误会,并不是你在HBuilder工具里打包时勾上开广告,app里就会出现广告。如果你没有真的去广告联盟后台申请认证,广告默认是不生效的,此时的app实际上是不会出现广告的。所以不要担心误开广告,就频繁在社区报问题或去广告联盟后台申请关闭。
如何关闭DCloud广告联盟
首先确认是DCloud的广告联盟,并且app上也真有广告,才有意义去谈如何关闭DCloud广告联盟。
如果你看到了广告,但根据上面的方法也不能确认是不是DCloud的广告,那么可以发出你的含广告的app或贴出截图到社区,我们来分析。
广告联盟
确认是 DCloud 广告平台的广告后,需要登录『DCloud开发者中心』。
在首页,找到出现广告的应用,点击应用名称进入该应用的管理界面。
左侧栏->广告设置
- 广告开通状态,切换为 off
- 填写『关闭原因』
- 点击保存
或者在HBuilder打包界面,点那个链接"开通更多广告,获取更多收益",也可以直达广告管理界面,那个链接其实就是广告管理的意思,文字描述我们下版会改的更清楚点。
关闭广告的申请审核周期,通常为1-2个工作日,提交后请耐心等待。
之所以需要人工审核,是因为经常会发生误关广告。
大多是因为appid冲突,甲要关广告,乙要开广告,而appid竟然一样。
如果是为了Appstore审核期临时不显示广告,那么不是点申请关闭广告,而是另有一个设置。这种情况是不需要申请,直接生效。
关闭申请通过后,广告就不会再下发,无需重新打包。
换量联盟
如果加入了『换量联盟』,并且没有填写自己的换量app下载地址,此时你的app可以给别人导流,但别人无法给你导流。这种情况下为了保护你的流量权益,会用广告填充换量,即使不能真的换量,至少可以获取收入。
同样,如果需要关闭换量,需要登录『DCloud开发者中心』。找到目标应用后,进入应用的管理界面。
左侧栏->换量设置
- 开通状态,切换为 off
- 点击保存
- 此操作会及时生效
关于『换量联盟』,这篇《新增用户翻倍!免费资源就在换量联盟!》文章了解一下。
身份认证
在进行上述操作的时候,可能会因为该账户没有认证,导致没有权限进行相关操作。这时,需要首先完成账号的实名认证。
关于『实名认证』,请参考 http://ask.dcloud.net.cn/question/55369 中 @DCloud_heavensoft 回复中的相关说明,这里就不重复叙述了。
再次提醒,实名认证分为个人和企业。
如果是公司app,一定要是公司来认证,千万别个人来认证。
如果是外包项目,一定要最终用户来认证。就像外包公司给甲方做app时,甲方仍然要以自己的名义申请Apple账户、微信sdk认证一样,也需要甲方以自己的名义开通DCloud的实名认证。
实名认证的周期,通常为1-2个工作日。
如果认证主体和现有创建者不一致,需要在开发者中心点击变更所有者;如果目前的开发人员仍在继续开发,则由app所有者通过添加协作者把开发人员含进来,否则目前的开发人员就不能继续打这个appid的包了。
有些开发者没怎么用过DCloud的开发者中心,要好好研究下,理顺所有者、协作者的关系。
注意事项
-
遇到 appid 管理失误又无法联系到 appid 的所有者进行变更时,请通过邮件向 service@dcloud.io 求助。
-
无论是『实名认证』还是『关闭广告申请』,都会在相应周期内完成认证,请耐心等待。
-
如果上述操作完成后,依旧出现广告信息,请按照上面的说明,单独发帖提供截图等相关信息。
-
不要重复提交认证信息,更不要频繁变更状态。
-
ide打包界面打个勾,不等于广告开了,还需要在开发者中心后台填写很多资料并经过审核才会有广告
-
广告不管开通还是关闭,都是要经过DCloud人工审核的,不存在开广告自动,关广告人工审核的情况!
-
Appstore提审时提示idfa,那不是开通DCloud广告的意思,详见:https://ask.dcloud.net.cn/article/36107
可能的原因及方案
- 网络劫持
很多悬浮球或底部悬浮banner是因为三方网络劫持发生,尤其常见于加载非https的在线url。本地HTML+ajax不存在此问题。https 的 url 也不存在。本地化或加 https 可以规避三方网络劫持。不懂什么是网络劫持的自行百度下。验证网络劫持的常用办法,是切换网络后看还有没有广告了,比如从4G换成wifi,如果不是同一个网络运营商,一般不会有相同的劫持。 - 安卓三方模拟器广告
一些三方的安卓模拟器,在运行apk后会弹他们自己的开屏广告,也令人防不胜防。
遇到过有开发者误以为这个是DCloud的开屏广告。此时要换到真机上再测试下。
尤其是使用HBuilder真机运行基座是不会有广告的,在模拟器上看到真机运行的基座也有广告,大概率是被模拟器劫持了。 - 离线打包内嵌了三方 SDK,这些 SDK 带广告。这个情况非常常见,所以一定要谨慎使用三方 SDK。
- appid 和所有者混乱
你的 appid 使用了别人的 appid,常见于复制项目时没有更改 appid,别人的 App 开了广告,导致你的 App 也跟着开广告了。尤其是很多开发者使用的 appid 是 HelloH5 或 HelloMUI,这肯定会出乱子。
还有些开发者,做了很多个项目,都使用同一个appid。此时任一app申请开广告,就会导致所有app都打开广告。
我们已经遇到几个因此发生的事故,尤其是有的app是外包公司给客户做的,影响很严重,请务必排查appid,保证appid的真实有效和独立性。 - 对于公司项目,务必注意 appid 的所有者没有离职,如若离职时及时更换所有者。默认情况下 appid 的创建者为所有者,其他人为协作者。如需查询或变更,在开发者中心 dev.dcloud.net.cn 管理。
- 务必保证使用真实有效邮箱注册 HBuilder 账户,邮箱账户注销前及时在开发者中心变更。乱填别人的邮箱也会造成 App 管理权失效。
- 检查好自己的配置,多人协作项目需要检查所有人的配置。广告开通既可以在 manifest.json 中体现,也可以云端配置是否显示。开发者中心也登录检查下。
- HBuilder工具误开广告
其实这是误会,并不是你在HBuilder工具里打包时勾上开广告,app里就会出现广告。如果你没有真的去广告联盟后台申请认证,广告默认是不生效的,此时的app实际上是不会出现广告的。所以不要担心误开广告,就频繁在社区报问题或去广告联盟后台申请关闭。
如何关闭DCloud广告联盟
首先确认是DCloud的广告联盟,并且app上也真有广告,才有意义去谈如何关闭DCloud广告联盟。
如果你看到了广告,但根据上面的方法也不能确认是不是DCloud的广告,那么可以发出你的含广告的app或贴出截图到社区,我们来分析。
广告联盟
确认是 DCloud 广告平台的广告后,需要登录『DCloud开发者中心』。
在首页,找到出现广告的应用,点击应用名称进入该应用的管理界面。
左侧栏->广告设置
- 广告开通状态,切换为 off
- 填写『关闭原因』
- 点击保存
或者在HBuilder打包界面,点那个链接"开通更多广告,获取更多收益",也可以直达广告管理界面,那个链接其实就是广告管理的意思,文字描述我们下版会改的更清楚点。
关闭广告的申请审核周期,通常为1-2个工作日,提交后请耐心等待。
之所以需要人工审核,是因为经常会发生误关广告。
大多是因为appid冲突,甲要关广告,乙要开广告,而appid竟然一样。
如果是为了Appstore审核期临时不显示广告,那么不是点申请关闭广告,而是另有一个设置。这种情况是不需要申请,直接生效。
关闭申请通过后,广告就不会再下发,无需重新打包。
换量联盟
如果加入了『换量联盟』,并且没有填写自己的换量app下载地址,此时你的app可以给别人导流,但别人无法给你导流。这种情况下为了保护你的流量权益,会用广告填充换量,即使不能真的换量,至少可以获取收入。
同样,如果需要关闭换量,需要登录『DCloud开发者中心』。找到目标应用后,进入应用的管理界面。
左侧栏->换量设置
- 开通状态,切换为 off
- 点击保存
- 此操作会及时生效
关于『换量联盟』,这篇《新增用户翻倍!免费资源就在换量联盟!》文章了解一下。
身份认证
在进行上述操作的时候,可能会因为该账户没有认证,导致没有权限进行相关操作。这时,需要首先完成账号的实名认证。
关于『实名认证』,请参考 http://ask.dcloud.net.cn/question/55369 中 @DCloud_heavensoft 回复中的相关说明,这里就不重复叙述了。
再次提醒,实名认证分为个人和企业。
如果是公司app,一定要是公司来认证,千万别个人来认证。
如果是外包项目,一定要最终用户来认证。就像外包公司给甲方做app时,甲方仍然要以自己的名义申请Apple账户、微信sdk认证一样,也需要甲方以自己的名义开通DCloud的实名认证。
实名认证的周期,通常为1-2个工作日。
如果认证主体和现有创建者不一致,需要在开发者中心点击变更所有者;如果目前的开发人员仍在继续开发,则由app所有者通过添加协作者把开发人员含进来,否则目前的开发人员就不能继续打这个appid的包了。
有些开发者没怎么用过DCloud的开发者中心,要好好研究下,理顺所有者、协作者的关系。
注意事项
-
遇到 appid 管理失误又无法联系到 appid 的所有者进行变更时,请通过邮件向 service@dcloud.io 求助。
-
无论是『实名认证』还是『关闭广告申请』,都会在相应周期内完成认证,请耐心等待。
-
如果上述操作完成后,依旧出现广告信息,请按照上面的说明,单独发帖提供截图等相关信息。
-
不要重复提交认证信息,更不要频繁变更状态。
-
ide打包界面打个勾,不等于广告开了,还需要在开发者中心后台填写很多资料并经过审核才会有广告
-
广告不管开通还是关闭,都是要经过DCloud人工审核的,不存在开广告自动,关广告人工审核的情况!
-
Appstore提审时提示idfa,那不是开通DCloud广告的意思,详见:https://ask.dcloud.net.cn/article/36107

在线一键生成安卓证书keystore文件
HBuilder开发工具有默认的安卓证书提供,但如果你需要上架需要用自己申请安卓证书keystore文件打包apk
现有方便的工具,直接在网页就可以申请安卓证书,秒搞定。
首先打开这个网页
http://www.applicationloader.net/appuploader/keystore.php
输入别名,证书密码,组织名称,点击生成证书就好自动生成并且下载安卓证书keystore文件

HBuilder开发工具有默认的安卓证书提供,但如果你需要上架需要用自己申请安卓证书keystore文件打包apk
现有方便的工具,直接在网页就可以申请安卓证书,秒搞定。
首先打开这个网页
http://www.applicationloader.net/appuploader/keystore.php
输入别名,证书密码,组织名称,点击生成证书就好自动生成并且下载安卓证书keystore文件
收起阅读 »
个推写的js
这是我写的推送js源文件
var Push = function () {
}
//推送格式
//{"e":"admin_edit_driver","eid":"1111","params":{"barcode":"IIG370554","status":"100"}}
/**
*
* 推送的监听
*/
Push.prototype.pushListener = function () {
var _this = this;
plus.push.addEventListener("click", function (msg) {
switch (msg.payload) {
case "LocalMSG":
ApiConfig.staticToast("点击本地创建消息启动:");
ApiConfig.staticIsDebug(null, "点击本地创建消息启动:");
break;
default:
ApiConfig.staticToast("点击离线推送消息启动:");
ApiConfig.staticIsDebug(null, "点击离线推送消息启动:");
break;
}
if (msg.payload) {
ApiConfig.staticIsDebug("click", msg, 1);
_this.handle(msg);
}
}, false);
plus.push.addEventListener("receive", function (msg) {
if (msg.aps) { // Apple APNS message
ApiConfig.staticToast("接收到在线APNS消息:");
ApiConfig.staticIsDebug(null, "接收到在线APNS消息:");
} else {
ApiConfig.staticToast("接收到在线透传消息:");
ApiConfig.staticIsDebug(null, "接收到在线透传消息:");
}
if (plus.os.name == 'iOS') {
if (msg.payload) {
_this.notificationMessage(msg);
}
} else {
_this.notificationMessage(msg);
}
}, false);
}
/**
* 解析透传并分别处理
* @param {Object} msg
*/
Push.prototype.notificationMessage = function (msg) {
ApiConfig.staticToast(msg, 1);
ApiConfig.staticIsDebug("notificationMessage", msg, 1);
var content = '';
var _this = this;
var jsonData = '';
switch (plus.os.name) {
case "Android":
jsonData = eval("(" + msg.payload + ")");
break;
case "iOS":
jsonData = msg.payload;
break;
}
switch (jsonData.e) {
case 'admin_version_update':
content = '版本更新';
break;
default:
break;
}
if (content) {
_this.createLocalPushMsg(msg, content);
}
}
/**
* 根据透传信息创建一条本地推送消息内容
* @param {Object} msg
* @param {Object} content
* main页面 2中情况
* 1.订单状态改变 刷新页面
* 2.订单完成创建本地推送消息点击跳到订单详情界面
* orderDetail页面
* 1.相同的order_id加载成订单改变的界面
* 2.不相同的order_id通知一下
* 3.支付成功相同的order_id跳到成功页面
* 4.支付成功不相同order_id通知一下
* updateProduct页面
* 1.所有的都只通知一下
*
*/
Push.prototype.createLocalPushMsg = function (msg, content) {
ApiConfig.staticIsDebug("createLocalPushMsg", msg, 1);
var _this = this;
var options = {
cover: false
};
var jsonData = '';
switch (plus.os.name) {
case "Android":
jsonData = eval("(" + msg.payload + ")");
break;
case "iOS":
jsonData = msg.payload;
break;
}
var str = content ? content : "";
var sell_main = plus.webview.getWebviewById('sell_main');
var searchOrderList = plus.webview.getWebviewById('searchOrderList');
var searchTaskList = plus.webview.getWebviewById('searchTaskList');
var topWeb = plus.webview.getTopWebview();
var userInfo = DbUtils.getStorage('userInfo', 1);
var isPushOrder;
//通知具体页面的sell_main 什么操作pushRefresh 参数{order: isPushOrder}
mui.fire(sell_main, 'pushRefresh', {order: isPushOrder});
_this.createMessage(str, jsonData, options);
}
/**
* mui创建本地方法的API
* @param str
* @param jsonData
* @param options
*/
Push.prototype.createMessage = function (str, jsonData, options) {
switch (plus.os.name) {
case "Android":
break;
case "iOS":
jsonData = jsonData.eid;
break;
}
plus.push.createMessage(str, jsonData, options);
}
/**
* 支付成功后掉头跳转
* @param orderDetail
*/
Push.prototype.openPaySuccess = function (orderDetail) {
var openUrl = 'view/driver/paySuccess.html';
var openId = 'paySuccess';
var orderParams = {
order: orderDetail
};
utilsJs.openWebView(openUrl, openId, orderParams);
}
/**
* 点击通知的处理方法
* @param {Object} msg
*/
Push.prototype.handle = function (msg) {
var _this = this;
var isPushOrder;
var sell_main = plus.webview.getWebviewById('sell_main');
ApiConfig.staticIsDebug("msg", msg, 1);
var order_id = '';
var jsonData = '';
switch (plus.os.name) {
case "Android":
jsonData = eval("(" + msg.payload + ")");
order_id = jsonData.eid;
break;
case "iOS":
if (msg.aps) {
try {
jsonData = msg.payload;
order_id = jsonData.eid;
} catch (e) {
}
} else {
jsonData = msg.payload;
order_id = jsonData;
}
break;
}
var userInfo = DbUtils.getStorage('userInfo', 1);
var openUrl = '';
var openId = '';
var order = null;
var task = null;
switch (jsonData.e) {
case 'admin_order_status':
isPushOrder = 1;
break;
case 'admin_order_pay':
isPushOrder = 1;
break;
case 'admin_driver_new_task':
isPushOrder = 0;
break;
case 'admin_prospect_verification':
isPushOrder = 0;
break;
default:
break;
}
//刷新首页内容
mui.fire(sell_main, 'Refresh', {order: isPushOrder});
//跳转到当前推送消息订单
_this.openUrlParams(openUrl, openId, {
order: order
});
}
/**
* 跳转的页面方法
* @param {Object} openUrl
* @param {Object} openId
* @param {Object} params
*/
Push.prototype.openUrlParams = function (openUrl, openId, params) {
utilsJs.openWebView(openUrl, openId, params);
}
/**
*清除ios小红点
*/
Push.prototype.cancelPushClear = function () {
plus.push.clear();
}
此代码仅使用html5 不使用混编,几个月前写的可能有一些遗漏地方,如果有误请指正。qq:934834037
这是我写的推送js源文件
var Push = function () {
}
//推送格式
//{"e":"admin_edit_driver","eid":"1111","params":{"barcode":"IIG370554","status":"100"}}
/**
*
* 推送的监听
*/
Push.prototype.pushListener = function () {
var _this = this;
plus.push.addEventListener("click", function (msg) {
switch (msg.payload) {
case "LocalMSG":
ApiConfig.staticToast("点击本地创建消息启动:");
ApiConfig.staticIsDebug(null, "点击本地创建消息启动:");
break;
default:
ApiConfig.staticToast("点击离线推送消息启动:");
ApiConfig.staticIsDebug(null, "点击离线推送消息启动:");
break;
}
if (msg.payload) {
ApiConfig.staticIsDebug("click", msg, 1);
_this.handle(msg);
}
}, false);
plus.push.addEventListener("receive", function (msg) {
if (msg.aps) { // Apple APNS message
ApiConfig.staticToast("接收到在线APNS消息:");
ApiConfig.staticIsDebug(null, "接收到在线APNS消息:");
} else {
ApiConfig.staticToast("接收到在线透传消息:");
ApiConfig.staticIsDebug(null, "接收到在线透传消息:");
}
if (plus.os.name == 'iOS') {
if (msg.payload) {
_this.notificationMessage(msg);
}
} else {
_this.notificationMessage(msg);
}
}, false);
}
/**
* 解析透传并分别处理
* @param {Object} msg
*/
Push.prototype.notificationMessage = function (msg) {
ApiConfig.staticToast(msg, 1);
ApiConfig.staticIsDebug("notificationMessage", msg, 1);
var content = '';
var _this = this;
var jsonData = '';
switch (plus.os.name) {
case "Android":
jsonData = eval("(" + msg.payload + ")");
break;
case "iOS":
jsonData = msg.payload;
break;
}
switch (jsonData.e) {
case 'admin_version_update':
content = '版本更新';
break;
default:
break;
}
if (content) {
_this.createLocalPushMsg(msg, content);
}
}
/**
* 根据透传信息创建一条本地推送消息内容
* @param {Object} msg
* @param {Object} content
* main页面 2中情况
* 1.订单状态改变 刷新页面
* 2.订单完成创建本地推送消息点击跳到订单详情界面
* orderDetail页面
* 1.相同的order_id加载成订单改变的界面
* 2.不相同的order_id通知一下
* 3.支付成功相同的order_id跳到成功页面
* 4.支付成功不相同order_id通知一下
* updateProduct页面
* 1.所有的都只通知一下
*
*/
Push.prototype.createLocalPushMsg = function (msg, content) {
ApiConfig.staticIsDebug("createLocalPushMsg", msg, 1);
var _this = this;
var options = {
cover: false
};
var jsonData = '';
switch (plus.os.name) {
case "Android":
jsonData = eval("(" + msg.payload + ")");
break;
case "iOS":
jsonData = msg.payload;
break;
}
var str = content ? content : "";
var sell_main = plus.webview.getWebviewById('sell_main');
var searchOrderList = plus.webview.getWebviewById('searchOrderList');
var searchTaskList = plus.webview.getWebviewById('searchTaskList');
var topWeb = plus.webview.getTopWebview();
var userInfo = DbUtils.getStorage('userInfo', 1);
var isPushOrder;
//通知具体页面的sell_main 什么操作pushRefresh 参数{order: isPushOrder}
mui.fire(sell_main, 'pushRefresh', {order: isPushOrder});
_this.createMessage(str, jsonData, options);
}
/**
* mui创建本地方法的API
* @param str
* @param jsonData
* @param options
*/
Push.prototype.createMessage = function (str, jsonData, options) {
switch (plus.os.name) {
case "Android":
break;
case "iOS":
jsonData = jsonData.eid;
break;
}
plus.push.createMessage(str, jsonData, options);
}
/**
* 支付成功后掉头跳转
* @param orderDetail
*/
Push.prototype.openPaySuccess = function (orderDetail) {
var openUrl = 'view/driver/paySuccess.html';
var openId = 'paySuccess';
var orderParams = {
order: orderDetail
};
utilsJs.openWebView(openUrl, openId, orderParams);
}
/**
* 点击通知的处理方法
* @param {Object} msg
*/
Push.prototype.handle = function (msg) {
var _this = this;
var isPushOrder;
var sell_main = plus.webview.getWebviewById('sell_main');
ApiConfig.staticIsDebug("msg", msg, 1);
var order_id = '';
var jsonData = '';
switch (plus.os.name) {
case "Android":
jsonData = eval("(" + msg.payload + ")");
order_id = jsonData.eid;
break;
case "iOS":
if (msg.aps) {
try {
jsonData = msg.payload;
order_id = jsonData.eid;
} catch (e) {
}
} else {
jsonData = msg.payload;
order_id = jsonData;
}
break;
}
var userInfo = DbUtils.getStorage('userInfo', 1);
var openUrl = '';
var openId = '';
var order = null;
var task = null;
switch (jsonData.e) {
case 'admin_order_status':
isPushOrder = 1;
break;
case 'admin_order_pay':
isPushOrder = 1;
break;
case 'admin_driver_new_task':
isPushOrder = 0;
break;
case 'admin_prospect_verification':
isPushOrder = 0;
break;
default:
break;
}
//刷新首页内容
mui.fire(sell_main, 'Refresh', {order: isPushOrder});
//跳转到当前推送消息订单
_this.openUrlParams(openUrl, openId, {
order: order
});
}
/**
* 跳转的页面方法
* @param {Object} openUrl
* @param {Object} openId
* @param {Object} params
*/
Push.prototype.openUrlParams = function (openUrl, openId, params) {
utilsJs.openWebView(openUrl, openId, params);
}
/**
*清除ios小红点
*/
Push.prototype.cancelPushClear = function () {
plus.push.clear();
}
此代码仅使用html5 不使用混编,几个月前写的可能有一些遗漏地方,如果有误请指正。qq:934834037
收起阅读 »
Bootstrap 模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。
如果您想要单独引用该插件的功能,那么您需要引用 modal.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。
用法
您可以切换模态框(Modal)插件的隐藏内容:
通过 data 属性:在控制器元素(比如按钮或者链接)上设置属性 data-toggle="modal",同时设置 data-target="#identifier" 或 href="#identifier" 来指定要切换的特定的模态框(带有 id="identifier")。
通过 JavaScript:使用这种技术,您可以通过简单的一行 JavaScript 来调用带有 id="identifier" 的模态框:
$('#identifier').modal(options)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Bootstrap 实例 - 模态框(Modal)插件</title>
<link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h2>创建模态框(Modal)</h2>
<!-- 按钮触发模态框 -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
开始演示模态框
</button>
<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
×
</button>
<h4 class="modal-title" id="myModalLabel">
模态框(Modal)标题
</h4>
</div>
<div class="modal-body">
在这里添加一些文本
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭
</button>
<button type="button" class="btn btn-primary">
提交更改
</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal -->
</div>
</body>
</html>
代码讲解:
使用模态窗口,您需要有某种触发器。您可以使用按钮或链接。这里我们使用的是按钮。
如果您仔细查看上面的代码,您会发现在 <button> 标签中,data-target="#myModal" 是您想要在页面上加载的模态框的目标。您可以在页面上创建多个模态框,然后为每个模态框创建不同的触发器。现在,很明显,您不能在同一时间加载多个模块,但您可以在页面上创建多个在不同时间进行加载。
在模态框中需要注意两点:
第一是 .modal,用来把 <div> 的内容识别为模态框。
第二是 .fade class。当模态框被切换时,它会引起内容淡入淡出。
aria-labelledby="myModalLabel",该属性引用模态框的标题。
属性 aria-hidden="true" 用于保持模态窗口不可见,直到触发器被触发为止(比如点击在相关的按钮上)。
<div class="modal-header">,modal-header 是为模态窗口的头部定义样式的类。
class="close",close 是一个 CSS class,用于为模态窗口的关闭按钮设置样式。
data-dismiss="modal",是一个自定义的 HTML5 data 属性。在这里它被用于关闭模态窗口。
class="modal-body",是 Bootstrap CSS 的一个 CSS class,用于为模态窗口的主体设置样式。
class="modal-footer",是 Bootstrap CSS 的一个 CSS class,用于为模态窗口的底部设置样式。
data-toggle="modal",HTML5 自定义的 data 属性 data-toggle 用于打开模态窗口。
方法
下面是一些可与 modal() 一起使用的有用的方法。
方法 描述 实例
Options: .modal(options) 把内容作为模态框激活。接受一个可选的选项对象。
$('#identifier').modal({
keyboard: false
})
Toggle: .modal('toggle') 手动切换模态框。
$('#identifier').modal('toggle')
Show: .modal('show') 手动打开模态框。
$('#identifier').modal('show')
Hide: .modal('hide') 手动隐藏模态框。
$('#identifier').modal('hide')
模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。
如果您想要单独引用该插件的功能,那么您需要引用 modal.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。
用法
您可以切换模态框(Modal)插件的隐藏内容:
通过 data 属性:在控制器元素(比如按钮或者链接)上设置属性 data-toggle="modal",同时设置 data-target="#identifier" 或 href="#identifier" 来指定要切换的特定的模态框(带有 id="identifier")。
通过 JavaScript:使用这种技术,您可以通过简单的一行 JavaScript 来调用带有 id="identifier" 的模态框:
$('#identifier').modal(options)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Bootstrap 实例 - 模态框(Modal)插件</title>
<link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<h2>创建模态框(Modal)</h2>
<!-- 按钮触发模态框 -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
开始演示模态框
</button>
<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
×
</button>
<h4 class="modal-title" id="myModalLabel">
模态框(Modal)标题
</h4>
</div>
<div class="modal-body">
在这里添加一些文本
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭
</button>
<button type="button" class="btn btn-primary">
提交更改
</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal -->
</div>
</body>
</html>
代码讲解:
使用模态窗口,您需要有某种触发器。您可以使用按钮或链接。这里我们使用的是按钮。
如果您仔细查看上面的代码,您会发现在 <button> 标签中,data-target="#myModal" 是您想要在页面上加载的模态框的目标。您可以在页面上创建多个模态框,然后为每个模态框创建不同的触发器。现在,很明显,您不能在同一时间加载多个模块,但您可以在页面上创建多个在不同时间进行加载。
在模态框中需要注意两点:
第一是 .modal,用来把 <div> 的内容识别为模态框。
第二是 .fade class。当模态框被切换时,它会引起内容淡入淡出。
aria-labelledby="myModalLabel",该属性引用模态框的标题。
属性 aria-hidden="true" 用于保持模态窗口不可见,直到触发器被触发为止(比如点击在相关的按钮上)。
<div class="modal-header">,modal-header 是为模态窗口的头部定义样式的类。
class="close",close 是一个 CSS class,用于为模态窗口的关闭按钮设置样式。
data-dismiss="modal",是一个自定义的 HTML5 data 属性。在这里它被用于关闭模态窗口。
class="modal-body",是 Bootstrap CSS 的一个 CSS class,用于为模态窗口的主体设置样式。
class="modal-footer",是 Bootstrap CSS 的一个 CSS class,用于为模态窗口的底部设置样式。
data-toggle="modal",HTML5 自定义的 data 属性 data-toggle 用于打开模态窗口。
方法
下面是一些可与 modal() 一起使用的有用的方法。
方法 描述 实例
Options: .modal(options) 把内容作为模态框激活。接受一个可选的选项对象。
$('#identifier').modal({
keyboard: false
})
Toggle: .modal('toggle') 手动切换模态框。
$('#identifier').modal('toggle')
Show: .modal('show') 手动打开模态框。
$('#identifier').modal('show')
Hide: .modal('hide') 手动隐藏模态框。
$('#identifier').modal('hide')

关于我最新发布的模板的获取说明,不看必然后悔
我发布的模板是基于
素材火 制作的
如果你是安卓手机,请先下载
百度浏览器 打开我发的模板帖子
下载地址
然后菜单 保存网页即可。。。
如果你是windows电脑,请先下载
360极速浏览器 打开我发的模板帖子
下载地址
然后菜单 保存网页即可。。
苹果手机不支持,再说了,你们都是土豪,也看不上我做的,毕竟,分分钟上千万啊!!!!
请注意,必须下载器上面我说的浏览器才有用,因为这是我和素材火老板商量好了的。。。。
当然啦,有的源码需要需要用另外的软件才能获取,,,,
如果你是土豪,欢迎签到购买,注册6个账号,每天每个账号签到一次,只需要10天左右,你需要的模板几乎都能下载完毕了的。。。。
我发布的模板是基于
素材火 制作的
如果你是安卓手机,请先下载
百度浏览器 打开我发的模板帖子
下载地址
然后菜单 保存网页即可。。。
如果你是windows电脑,请先下载
360极速浏览器 打开我发的模板帖子
下载地址
然后菜单 保存网页即可。。
苹果手机不支持,再说了,你们都是土豪,也看不上我做的,毕竟,分分钟上千万啊!!!!
请注意,必须下载器上面我说的浏览器才有用,因为这是我和素材火老板商量好了的。。。。
当然啦,有的源码需要需要用另外的软件才能获取,,,,
如果你是土豪,欢迎签到购买,注册6个账号,每天每个账号签到一次,只需要10天左右,你需要的模板几乎都能下载完毕了的。。。。