
解决底部选项卡被软键盘上顶问题
暂时解决思路:(缺点:在软键盘上来的时候选项卡会闪一下再消失)
获取选项卡的view(包括悬浮球:悬浮球是新绘制的view),运用setStyle()修改view样式;
监听窗口大小变化resize事件,对应改变样式width宽度。(经测试修改的样式只能是在mainfest.json的subsubNViews=>styles下的样式,新增样式好像没反应,height高度好像会影响整个的布局,所有修改了width的样式)
下面是部分代码:
var tabBottom = 0,nview = plus.nativeObj.View.getViewById('tabBar');
// 监听window的resize,避免软键盘顶上底部选项卡
window.addEventListener('resize', function() {
if(tabBottom == 0){
nview.setStyle({
width: "0px"
});
drawNativeIcon.setStyle({
width: "0px"
});
tabBottom = 1;
}else{
nview.setStyle({
width: '100%'
});
drawNativeIcon.setStyle({
width: "60px"
});
tabBottom = 0;
}
console.log('at index.html:624 webView styles'+JSON.stringify(self.getStyle().subNViews[0].styles));
});
闪一下再消失,还是感觉不太好,请问各路大神还有什么更好的方法吗?
2018.9.14
优化了上述的问题解决方法:
解决底部选项卡被软键盘上顶问题:
获取屏幕高度固定在底部,不上顶
解决软键盘弹出后,有一段区域穿透父页面问题:
监听窗口大小变化时改变子页面原来bottom:51px,再次变化时修改回来
/// 避免软键盘顶上底部选项卡
nview.setStyle({
top: (height - 50) + 'px',
});
drawNativeIcon.setStyle({
top: (height - 60) + 'px',
});
window.addEventListener('resize', function() {
if(activePage == plus.webview.getLaunchWebview()) {
return;
}
if(tabBottom == 0) {
activePage.setStyle({
bottom:'0px'
});
tabBottom = 1;
} else {
activePage.setStyle({
bottom:'51px'
});
tabBottom = 0;
}
app.log('self style',activePage.getStyle());
});
暂时解决思路:(缺点:在软键盘上来的时候选项卡会闪一下再消失)
获取选项卡的view(包括悬浮球:悬浮球是新绘制的view),运用setStyle()修改view样式;
监听窗口大小变化resize事件,对应改变样式width宽度。(经测试修改的样式只能是在mainfest.json的subsubNViews=>styles下的样式,新增样式好像没反应,height高度好像会影响整个的布局,所有修改了width的样式)
下面是部分代码:
var tabBottom = 0,nview = plus.nativeObj.View.getViewById('tabBar');
// 监听window的resize,避免软键盘顶上底部选项卡
window.addEventListener('resize', function() {
if(tabBottom == 0){
nview.setStyle({
width: "0px"
});
drawNativeIcon.setStyle({
width: "0px"
});
tabBottom = 1;
}else{
nview.setStyle({
width: '100%'
});
drawNativeIcon.setStyle({
width: "60px"
});
tabBottom = 0;
}
console.log('at index.html:624 webView styles'+JSON.stringify(self.getStyle().subNViews[0].styles));
});
闪一下再消失,还是感觉不太好,请问各路大神还有什么更好的方法吗?
2018.9.14
优化了上述的问题解决方法:
解决底部选项卡被软键盘上顶问题:
获取屏幕高度固定在底部,不上顶
解决软键盘弹出后,有一段区域穿透父页面问题:
监听窗口大小变化时改变子页面原来bottom:51px,再次变化时修改回来
/// 避免软键盘顶上底部选项卡
nview.setStyle({
top: (height - 50) + 'px',
});
drawNativeIcon.setStyle({
top: (height - 60) + 'px',
});
window.addEventListener('resize', function() {
if(activePage == plus.webview.getLaunchWebview()) {
return;
}
if(tabBottom == 0) {
activePage.setStyle({
bottom:'0px'
});
tabBottom = 1;
} else {
activePage.setStyle({
bottom:'51px'
});
tabBottom = 0;
}
app.log('self style',activePage.getStyle());
});
收起阅读 »

【插件、图表】7种图表漂亮丰富
声明:本插件移植自微信小程序插件wx-charts
https://github.com/xiaolin3303/wx-charts
感谢原作者!
我不生产插件,我只是好东西的搬运工~O(∩_∩)O哈哈~
需要的就伸手把,搬运移植也不容易,拿走记得留话。
其他功能插件:
1、uniapp图片裁剪插件
2、swiper + scroll-view 实现下拉刷新
3、单击back隐藏到后台
不啰嗦直接上图:

折线图:
可拖动折线图:
柱状图:
饼状图:
环形图:
区域图:
雷达图:
最后源码拿走不谢(记得留言)
声明:本插件移植自微信小程序插件wx-charts
https://github.com/xiaolin3303/wx-charts
感谢原作者!
我不生产插件,我只是好东西的搬运工~O(∩_∩)O哈哈~
需要的就伸手把,搬运移植也不容易,拿走记得留话。
其他功能插件:
1、uniapp图片裁剪插件
2、swiper + scroll-view 实现下拉刷新
3、单击back隐藏到后台
不啰嗦直接上图:
折线图:
可拖动折线图:
柱状图:
饼状图:
环形图:
区域图:
雷达图:
最后源码拿走不谢(记得留言)
收起阅读 »
自助微信公众号客服提醒功能开发的实现
本周我公司的技术人员做了一个有技术含量的一个新功能:客服功能。此功能主要用于微信公众号客服提醒,比如客户的商家认证审核通过,用户购买商品成功等功能提醒,可以有效减少网站项目开发所必要的资金节约。
1.接口代码。
接口代码如下:
public function reply_customer(){
$touser=I('touser');
$content=I('text');
$id=I("id");
//更换成自己的APPID和APPSECRET
$APPID="";
$APPSECRET="";
$TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET;
$json=file_get_contents($TOKEN_URL);
$result=json_decode($json);
$ACC_TOKEN=$result->access_token;
$data = '{
"touser":"'.$touser.'",
"msgtype":"text",
"text":
{
"content":"'.$content.'http://www.guangcupin.cc/Shop/info?id='.$id.'"
}
}';
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$ACC_TOKEN;
$result = $this->https_post($url,$data);
$final = json_decode($result);
echo $final;
}
public function https_post($url,$data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
if (curl_errno($curl)) {
return 'Errno'.curl_error($curl);
}
curl_close($curl);
return $result;
}
2.php调用接口代码
Php代码如下:
public function fenxiang(){
if(empty(session("uid"))){
$this->redirect("Init/init");
}
$uid=session("uid");
// echo $uid;exit;
$info=M("user")->where("uid=$uid")->find();
$mtime= strtotime("-1 hour");
$where['uid']=$uid;
$where['addtime']=array("gt",$mtime);
$where['fabu']=1;
$list=M("good")->where($where)->order("addtime desc")->limit(1)->find();
if($list){
$touser=$info['openid'];
$text="朋友圈分享文字,提供参考:".$list['desc'].",有喜欢的可以出价,截拍时间:".date("Y-m-d H:i",$list['end_time'])." 点击链接出价:";
$id=$list['id'];
// echo $id;exit;
$this->reply_customer1($touser,$text,$id);
}
}
好了,现在大家明白是如何来实现了吧,如果还是存在不理解的地方或者做到中间不清楚该如何继续下去的话,可以留言咨询,我们可以一起讨论学习。
本文由专业的郑州小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!
本周我公司的技术人员做了一个有技术含量的一个新功能:客服功能。此功能主要用于微信公众号客服提醒,比如客户的商家认证审核通过,用户购买商品成功等功能提醒,可以有效减少网站项目开发所必要的资金节约。
1.接口代码。
接口代码如下:
public function reply_customer(){
$touser=I('touser');
$content=I('text');
$id=I("id");
//更换成自己的APPID和APPSECRET
$APPID="";
$APPSECRET="";
$TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET;
$json=file_get_contents($TOKEN_URL);
$result=json_decode($json);
$ACC_TOKEN=$result->access_token;
$data = '{
"touser":"'.$touser.'",
"msgtype":"text",
"text":
{
"content":"'.$content.'http://www.guangcupin.cc/Shop/info?id='.$id.'"
}
}';
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$ACC_TOKEN;
$result = $this->https_post($url,$data);
$final = json_decode($result);
echo $final;
}
public function https_post($url,$data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
if (curl_errno($curl)) {
return 'Errno'.curl_error($curl);
}
curl_close($curl);
return $result;
}
2.php调用接口代码
Php代码如下:
public function fenxiang(){
if(empty(session("uid"))){
$this->redirect("Init/init");
}
$uid=session("uid");
// echo $uid;exit;
$info=M("user")->where("uid=$uid")->find();
$mtime= strtotime("-1 hour");
$where['uid']=$uid;
$where['addtime']=array("gt",$mtime);
$where['fabu']=1;
$list=M("good")->where($where)->order("addtime desc")->limit(1)->find();
if($list){
$touser=$info['openid'];
$text="朋友圈分享文字,提供参考:".$list['desc'].",有喜欢的可以出价,截拍时间:".date("Y-m-d H:i",$list['end_time'])." 点击链接出价:";
$id=$list['id'];
// echo $id;exit;
$this->reply_customer1($touser,$text,$id);
}
}
好了,现在大家明白是如何来实现了吧,如果还是存在不理解的地方或者做到中间不清楚该如何继续下去的话,可以留言咨询,我们可以一起讨论学习。
本文由专业的郑州小程序开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!
收起阅读 »
uniapp与vuex-i18n多语言处理
之前一直用vue-i18n,后来发现$t始终出不来。
最后使用了vuex-i18n,$t()可以用this.$i18n.translate()来代替,总算暂时解决了多语言问题。纠结了我好久
ps:可能vue-i18n也有$t的替代方法,可是文档内容太多看花眼了
main.js
import Vue from 'vue'
import App from './App'
import store from './store'
import vuexI18n from 'vuex-i18n';
Vue.use(vuexI18n.plugin, store);
const translationsEn = {
"content": "This is some {type} content"
};
const translationsDe = {
"content": "Dies ist ein toller Inhalt",
};
// add translations directly to the application
Vue.i18n.add('en', translationsEn);
Vue.i18n.add('de', translationsDe);
// set the start locale to use
Vue.i18n.set('de');
Vue.config.productionTip = false
Vue.prototype.$store = store
App.mpType = 'app'
const app = new Vue({
store,
...App,
})
app.$mount()
index.vue
<template>
<view class="content">
<text class="title">{{title}}=>{{t_content}}</text>
<button type="primary" @tap="ddd">button</button>
</view>
</template>
<script>
export default {
data: {
title: 'Hello',
cur_lang: 'en'
},
computed:{
t_content(){
return this.$i18n.translate('content')
}
},
methods:{
ddd(){
console.log(1122)
console.log(this.$i18n.translate('content'))
}
}
}
</script>
<style>
.content {
flex: 1;
justify-content: center;
align-items: center;
}
.title {
font-size: 36px;
color: #8f8f94;
}
</style>
之前一直用vue-i18n,后来发现$t始终出不来。
最后使用了vuex-i18n,$t()可以用this.$i18n.translate()来代替,总算暂时解决了多语言问题。纠结了我好久
ps:可能vue-i18n也有$t的替代方法,可是文档内容太多看花眼了
main.js
import Vue from 'vue'
import App from './App'
import store from './store'
import vuexI18n from 'vuex-i18n';
Vue.use(vuexI18n.plugin, store);
const translationsEn = {
"content": "This is some {type} content"
};
const translationsDe = {
"content": "Dies ist ein toller Inhalt",
};
// add translations directly to the application
Vue.i18n.add('en', translationsEn);
Vue.i18n.add('de', translationsDe);
// set the start locale to use
Vue.i18n.set('de');
Vue.config.productionTip = false
Vue.prototype.$store = store
App.mpType = 'app'
const app = new Vue({
store,
...App,
})
app.$mount()
index.vue
<template>
<view class="content">
<text class="title">{{title}}=>{{t_content}}</text>
<button type="primary" @tap="ddd">button</button>
</view>
</template>
<script>
export default {
data: {
title: 'Hello',
cur_lang: 'en'
},
computed:{
t_content(){
return this.$i18n.translate('content')
}
},
methods:{
ddd(){
console.log(1122)
console.log(this.$i18n.translate('content'))
}
}
}
</script>
<style>
.content {
flex: 1;
justify-content: center;
align-items: center;
}
.title {
font-size: 36px;
color: #8f8f94;
}
</style>
收起阅读 »

uni-app 尺寸单位更改及历史版本兼容说明
注意:本文仅对使用过HBuilderX 0.1.45-48的用户有意义,集中在2018年8月。之后的用户无需关心此文。
自HBuilderX 0.1.49 之后创建的uni-app项目,使用 rpx(upx) 作为响应式尺寸单位,rpx 可以根据屏幕宽度进行自适应;在新创建的uni-app项目中,px 是传统css尺寸单位。
但历史版本的uni-app曾使用 px 作为响应式尺寸单位(作用同 rpx ),uni-app 框架保留了对历史创建项目的向下兼容,开发者可按如下方式维护升级历史项目。
方案1:继续保留 px 为响应式尺寸单位
uni-app 历史项目可以继续将 px 作为响应式尺寸单位,继续之前的尺寸换算,框架会自动处理。
Tips 1:动态绑定的 style不支持响应式尺寸单位
<!-- - 静态px赋值,此时为响应式单位 -->
<view class="test" style="width:200px"></view>
<!-- - 动态绑定不生效,此时变成传统css单位 -->
<view class="test" :style="{width:winWidth + 'px;'}"></view>
Tips 2:若在历史项目中引入了使用px作为传统css尺寸单位的的示例组件,比如 hello uni-app 中新增的 多列选择、联动选择示例(含城市选择),则会导致同一项目中,px既作为响应式尺寸单位,又作为传统css尺寸单位,导致混乱,此时建议按照如下方案2的步骤,将历史项目的px升级替换为rpx(注意更改manifest.json文件),然后再引入使用px作为传统css尺寸单位的的示例组件
方案2:使用 rpx 作为响应式尺寸单位
开发者可以按如下步骤将 px 升级为 rpx:
- 全局搜索 px 替换为 rpx
- 在manifest.json根节点下,增加"transformPx":false
注意:如此替换升级后,px 恢复为传统的css尺寸单位,不再根据屏幕宽度自动响应。
注意:本文仅对使用过HBuilderX 0.1.45-48的用户有意义,集中在2018年8月。之后的用户无需关心此文。
自HBuilderX 0.1.49 之后创建的uni-app项目,使用 rpx(upx) 作为响应式尺寸单位,rpx 可以根据屏幕宽度进行自适应;在新创建的uni-app项目中,px 是传统css尺寸单位。
但历史版本的uni-app曾使用 px 作为响应式尺寸单位(作用同 rpx ),uni-app 框架保留了对历史创建项目的向下兼容,开发者可按如下方式维护升级历史项目。
方案1:继续保留 px 为响应式尺寸单位
uni-app 历史项目可以继续将 px 作为响应式尺寸单位,继续之前的尺寸换算,框架会自动处理。
Tips 1:动态绑定的 style不支持响应式尺寸单位
<!-- - 静态px赋值,此时为响应式单位 -->
<view class="test" style="width:200px"></view>
<!-- - 动态绑定不生效,此时变成传统css单位 -->
<view class="test" :style="{width:winWidth + 'px;'}"></view>
Tips 2:若在历史项目中引入了使用px作为传统css尺寸单位的的示例组件,比如 hello uni-app 中新增的 多列选择、联动选择示例(含城市选择),则会导致同一项目中,px既作为响应式尺寸单位,又作为传统css尺寸单位,导致混乱,此时建议按照如下方案2的步骤,将历史项目的px升级替换为rpx(注意更改manifest.json文件),然后再引入使用px作为传统css尺寸单位的的示例组件
方案2:使用 rpx 作为响应式尺寸单位
开发者可以按如下步骤将 px 升级为 rpx:
- 全局搜索 px 替换为 rpx
- 在manifest.json根节点下,增加"transformPx":false
注意:如此替换升级后,px 恢复为传统的css尺寸单位,不再根据屏幕宽度自动响应。
收起阅读 »
安卓index.html 如何传参数啊? 只能设置appBasePath啊
目前安卓只能这样:
/**
- 5+内核初始化完成时触发
-
*/
@Override
public void onCoreInitEnd(ICore coreHandler) {
String appBasePath = "/apps/H5928EE6E";
String args = "{url:'http://www.baidu.com'}";app = SDK.startWebApp(activity, appBasePath, args, new IWebviewStateListener() { // 设置Webview事件监听,可在监监听内获取WebIvew加载内容的进度 @Override public Object onCallBack(int pType, Object pArgs) { switch (pType) { case IWebviewStateListener.ON_WEBVIEW_READY: IWebview webview = ((IWebview) pArgs);
只能设置appBasePath,不能像苹果那样可以设置路径到index.html 这一层,如果能设置到index.html这一层到话,我就可以在index.html后面加参数,比如:/apps/H5928EE6E/www/......./index.html?param=xxx
,我知道可以设置args,然后通过plus.runtime...来获取,但是 我需要的是在plusReady之前就能获取到参数。
麻烦了。
目前安卓只能这样:
/**
- 5+内核初始化完成时触发
-
*/
@Override
public void onCoreInitEnd(ICore coreHandler) {
String appBasePath = "/apps/H5928EE6E";
String args = "{url:'http://www.baidu.com'}";app = SDK.startWebApp(activity, appBasePath, args, new IWebviewStateListener() { // 设置Webview事件监听,可在监监听内获取WebIvew加载内容的进度 @Override public Object onCallBack(int pType, Object pArgs) { switch (pType) { case IWebviewStateListener.ON_WEBVIEW_READY: IWebview webview = ((IWebview) pArgs);
只能设置appBasePath,不能像苹果那样可以设置路径到index.html 这一层,如果能设置到index.html这一层到话,我就可以在index.html后面加参数,比如:/apps/H5928EE6E/www/......./index.html?param=xxx
,我知道可以设置args,然后通过plus.runtime...来获取,但是 我需要的是在plusReady之前就能获取到参数。
麻烦了。

一套 B2B2C 积分返还商城模板
该模板基于MUI开发尽量保证MUI的原有功能并结合了iconfont图标库、大大提升填补了MUI缺少及美化页面,美化页面如下:
主页美化、产品列表(筛选)、产品详情(加入购物车弹层、右上角下拉)、商家详情(基于MUI多页面切换)、购物车(购物车多选)、购物车订单结算、会员中心美化(居中弹层)、收货地址(地区选择)、关于我们(基于MUI多页面切换)、订单列表、订单详情(物流查询页面)、产品评论(星级评价)、登录注册页面美化。
http://www.8sk.cn/Download/760.html
该模板基于MUI开发尽量保证MUI的原有功能并结合了iconfont图标库、大大提升填补了MUI缺少及美化页面,美化页面如下:
主页美化、产品列表(筛选)、产品详情(加入购物车弹层、右上角下拉)、商家详情(基于MUI多页面切换)、购物车(购物车多选)、购物车订单结算、会员中心美化(居中弹层)、收货地址(地区选择)、关于我们(基于MUI多页面切换)、订单列表、订单详情(物流查询页面)、产品评论(星级评价)、登录注册页面美化。
http://www.8sk.cn/Download/760.html

HTML编程之如何使用JS实现前端缓存
在前端浏览器中,有些数据(比如数据字典中的数据),可以在第一次请求的时候全部拿过来保存在js对象中,以后需要的时候就不用每次都去请求服务器了。对于那些大量使用数据字典来填充下拉框的页面,这种方法可以极大地减少对服务器的访问。因此这种方法特别适用于使用iframe的框架。
具体实现思路和方法如下:
创建一个cache.js文件:
1、前端页面,定义那些数据需要一次性拿到前端缓存,定义一个对象来保存这些数据:
/**
* 定义需要在用户登录的时候获取到本地的数据字典类别
*/
var clsCodes = {"clsCodes" :
["BOOL",
"STATUS",
"USER_TYPE",
"REPORT_STATUS"
]
};
/**
* 获取数据字典到本地
*/
var dicts;
2、前端页面,定义一个函数来调用后台接口获取数据,然后保存到本地缓存对象(dicts)中。
function getDicts() {
$.post(getContextPath() + "/api/sys/getDictList",
clsCodes,
function(resultBean, status, xhRequest) {
if (resultBean.data != undefined) {
dicts = resultBean.data;
}
},
'json');
}
在主页面加载的时候调用这个方法一次性获取数据并缓存起来。这样,以后需要同样的数据,就直接从本地对象dicts中获取了。如果大家还存在疑问的话,可以留言咨询,我们可以共同学习,一起进步。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!
在前端浏览器中,有些数据(比如数据字典中的数据),可以在第一次请求的时候全部拿过来保存在js对象中,以后需要的时候就不用每次都去请求服务器了。对于那些大量使用数据字典来填充下拉框的页面,这种方法可以极大地减少对服务器的访问。因此这种方法特别适用于使用iframe的框架。
具体实现思路和方法如下:
创建一个cache.js文件:
1、前端页面,定义那些数据需要一次性拿到前端缓存,定义一个对象来保存这些数据:
/**
* 定义需要在用户登录的时候获取到本地的数据字典类别
*/
var clsCodes = {"clsCodes" :
["BOOL",
"STATUS",
"USER_TYPE",
"REPORT_STATUS"
]
};
/**
* 获取数据字典到本地
*/
var dicts;
2、前端页面,定义一个函数来调用后台接口获取数据,然后保存到本地缓存对象(dicts)中。
function getDicts() {
$.post(getContextPath() + "/api/sys/getDictList",
clsCodes,
function(resultBean, status, xhRequest) {
if (resultBean.data != undefined) {
dicts = resultBean.data;
}
},
'json');
}
在主页面加载的时候调用这个方法一次性获取数据并缓存起来。这样,以后需要同样的数据,就直接从本地对象dicts中获取了。如果大家还存在疑问的话,可以留言咨询,我们可以共同学习,一起进步。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!
收起阅读 »
hbuildX打包苹果企业版证书,发布出去是内测版。用hbuilder 打包是正常的企业版
hbuildX打包苹果企业版证书,发布出去是内测版。用hbuilder 打包是正常的企业版
hbuildX打包苹果企业版证书,发布出去是内测版。用hbuilder 打包是正常的企业版

如何批量安装apk到手机
如果你有多个apk在电脑上,期望批量安装到手机上,那么本文就是你想要的。
HBuilderX的多光标对于批量操作有巨大效率帮助。
分享下我自己的经验。
第1步. 资源管理器里新建一个installapks.bat(文件名随意,可以用txt改后缀),点右键使用HBuilderX打开
第2步. 把资源管理器的一堆apk选中,拖入HBuilderX的这个bat编辑器,或者在资源管理器里复制然后粘贴到HBuilderX的编辑器里,得到如下文档内容:
file:///D:/Downloads/65624.apk
file:///D:/Downloads/13641.apk
file:///D:/Downloads/74707.apk
file:///D:/Downloads/43805.apk
file:///D:/Downloads/72811.apk
file:///D:/Downloads/93502.apk
file:///D:/Downloads/24900.apk
file:///D:/Downloads/51039.apk
file:///D:/Downloads/31703.apk
file:///D:/Downloads/80758.apk
注:如果你在HBuilderX的markdown文档里粘贴,会自动变成这种超链接格式,此时按Ctrl+z会还原为文本格式。
第3步. 复制一段文字"adb install -r "到剪切板
第4步. 清除每行开头的"file:///"并替换为"adb install -r "
这里方法很多种:
- 按下alt,鼠标拖选,执行列选择,选中整列的"file:///"然后粘贴
- 选中一个"file:///",然后Ctrl+h执行替换,在右上角的替换框里粘贴"adb install -r ",点全部替换
得到如下文档内容:adb install -r D:/Downloads/65624.apk adb install -r D:/Downloads/13641.apk adb install -r D:/Downloads/74707.apk adb install -r D:/Downloads/43805.apk adb install -r D:/Downloads/72811.apk adb install -r D:/Downloads/93502.apk adb install -r D:/Downloads/24900.apk adb install -r D:/Downloads/51039.apk adb install -r D:/Downloads/31703.apk adb install -r D:/Downloads/80758.apk
第5步. 确保adb命令的存在
如果你本机电脑的adb已经在环境变量里了,那就可以直接双击运行这个bat文件了。
如果没有adb,那么HBuilderX的"工具-插件管理"里安装"App开发真机运行"插件时会自带一个adb,如你用HBuilderX开发app则会自动安装这个插件。
它的目录在HBuilderX的plugins\launcher\base\下
此时在这个bat文件的第一行,加入如下文字内容:cd D:\Software\HBuilderX\plugins\launcher\base
然后保存,在资源管理器里双击bat运行即可
完整文档格式如下:cd D:\Software\HBuilderX\plugins\launcher\base adb install -r D:/Downloads/65624.apk adb install -r D:/Downloads/13641.apk adb install -r D:/Downloads/74707.apk adb install -r D:/Downloads/43805.apk adb install -r D:/Downloads/72811.apk adb install -r D:/Downloads/93502.apk adb install -r D:/Downloads/24900.apk adb install -r D:/Downloads/51039.apk adb install -r D:/Downloads/31703.apk adb install -r D:/Downloads/80758.apk
如果你有多个apk在电脑上,期望批量安装到手机上,那么本文就是你想要的。
HBuilderX的多光标对于批量操作有巨大效率帮助。
分享下我自己的经验。
第1步. 资源管理器里新建一个installapks.bat(文件名随意,可以用txt改后缀),点右键使用HBuilderX打开
第2步. 把资源管理器的一堆apk选中,拖入HBuilderX的这个bat编辑器,或者在资源管理器里复制然后粘贴到HBuilderX的编辑器里,得到如下文档内容:
file:///D:/Downloads/65624.apk
file:///D:/Downloads/13641.apk
file:///D:/Downloads/74707.apk
file:///D:/Downloads/43805.apk
file:///D:/Downloads/72811.apk
file:///D:/Downloads/93502.apk
file:///D:/Downloads/24900.apk
file:///D:/Downloads/51039.apk
file:///D:/Downloads/31703.apk
file:///D:/Downloads/80758.apk
注:如果你在HBuilderX的markdown文档里粘贴,会自动变成这种超链接格式,此时按Ctrl+z会还原为文本格式。
第3步. 复制一段文字"adb install -r "到剪切板
第4步. 清除每行开头的"file:///"并替换为"adb install -r "
这里方法很多种:
- 按下alt,鼠标拖选,执行列选择,选中整列的"file:///"然后粘贴
- 选中一个"file:///",然后Ctrl+h执行替换,在右上角的替换框里粘贴"adb install -r ",点全部替换
得到如下文档内容:adb install -r D:/Downloads/65624.apk adb install -r D:/Downloads/13641.apk adb install -r D:/Downloads/74707.apk adb install -r D:/Downloads/43805.apk adb install -r D:/Downloads/72811.apk adb install -r D:/Downloads/93502.apk adb install -r D:/Downloads/24900.apk adb install -r D:/Downloads/51039.apk adb install -r D:/Downloads/31703.apk adb install -r D:/Downloads/80758.apk
第5步. 确保adb命令的存在
如果你本机电脑的adb已经在环境变量里了,那就可以直接双击运行这个bat文件了。
如果没有adb,那么HBuilderX的"工具-插件管理"里安装"App开发真机运行"插件时会自带一个adb,如你用HBuilderX开发app则会自动安装这个插件。
它的目录在HBuilderX的plugins\launcher\base\下
此时在这个bat文件的第一行,加入如下文字内容:cd D:\Software\HBuilderX\plugins\launcher\base
然后保存,在资源管理器里双击bat运行即可
完整文档格式如下:cd D:\Software\HBuilderX\plugins\launcher\base adb install -r D:/Downloads/65624.apk adb install -r D:/Downloads/13641.apk adb install -r D:/Downloads/74707.apk adb install -r D:/Downloads/43805.apk adb install -r D:/Downloads/72811.apk adb install -r D:/Downloads/93502.apk adb install -r D:/Downloads/24900.apk adb install -r D:/Downloads/51039.apk adb install -r D:/Downloads/31703.apk adb install -r D:/Downloads/80758.apk

云打包失败,也没有任何报错。原因是图片名称含中文
记录一个云打包不成功但是又没有任何错误提示的问题以及我的排错方式
直接说问题所在: 项目中引用了包含中文名字的图片,经过验证,把名字改成不含中文就打包成功,再改成中文就失败
出现问题:
第一天还成功打包过这个项目,第二天就打包不成功。
打包的状态知道编译完成,然后没有动静了,没有弹框提示,也没有报错,尝试多次还是一样。
可能原因:
1、官方云打包暂时出问题 (咨询后排除)
2、编辑器出问题 (通过新建项目运行打包,打包成功,此项排除)
3、项目本身问题
第三个问题的排除方法:
上一次打包成功后新增了代码,同时还合并了同事的代码。
1、通过git回滚,定位是哪一个commit出的问题
2、再查看出问题的那个版本里有了哪些改变
3、一个个排除这些改变
最后定位到了中文名称图片的问题,折腾了大半天,终于解决了问题。
不知道这个算不算bug,还是说官方已经说明不能用中文名的图片或者文件,只是我没有看到而已。
当时使用的HX是8月23号发的版本
记录一个云打包不成功但是又没有任何错误提示的问题以及我的排错方式
直接说问题所在: 项目中引用了包含中文名字的图片,经过验证,把名字改成不含中文就打包成功,再改成中文就失败
出现问题:
第一天还成功打包过这个项目,第二天就打包不成功。
打包的状态知道编译完成,然后没有动静了,没有弹框提示,也没有报错,尝试多次还是一样。
可能原因:
1、官方云打包暂时出问题 (咨询后排除)
2、编辑器出问题 (通过新建项目运行打包,打包成功,此项排除)
3、项目本身问题
第三个问题的排除方法:
上一次打包成功后新增了代码,同时还合并了同事的代码。
1、通过git回滚,定位是哪一个commit出的问题
2、再查看出问题的那个版本里有了哪些改变
3、一个个排除这些改变
最后定位到了中文名称图片的问题,折腾了大半天,终于解决了问题。
不知道这个算不算bug,还是说官方已经说明不能用中文名的图片或者文件,只是我没有看到而已。
当时使用的HX是8月23号发的版本

终于解决:uni.getLocation 这个大bug终于确定了,官方还请跟进一下
经过几天的辗转反侧,终于从坑里面走出来!
miui 在 "targetSdkVersion" : 26, 无法获得 uni.getLocation.
目前解决办法,targetSdkVersion 改成 23就好了。
但是 谷歌和小米商店,已经强制 targetSdkVersion 必须是 26. 请官方修改哦。
目前 uniapp 默认的targetSDKVersion 是 21,所以你怎么测试,都是可以,都觉得我的无理取闹!
经过几天的辗转反侧,终于从坑里面走出来!
miui 在 "targetSdkVersion" : 26, 无法获得 uni.getLocation.
目前解决办法,targetSdkVersion 改成 23就好了。
但是 谷歌和小米商店,已经强制 targetSdkVersion 必须是 26. 请官方修改哦。
目前 uniapp 默认的targetSDKVersion 是 21,所以你怎么测试,都是可以,都觉得我的无理取闹!
收起阅读 »