HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

mac系统 内置浏览器控制台空白解决

空白

百度了半天,搜hubliderX 调试空白,不能手机调试,等等等等各种都搜不到,发现每个人表达的方式不同。
为了方便其他朋友可以搜到,发一个帖子记录一下

解决方案:
应该是端口被占用造成的。

打开操作系统终端,输入如下命令试试:

lsof -i:9777 | awk '{print $2}' | tail -n +2 | xargs kill -9
继续阅读 »

百度了半天,搜hubliderX 调试空白,不能手机调试,等等等等各种都搜不到,发现每个人表达的方式不同。
为了方便其他朋友可以搜到,发一个帖子记录一下

解决方案:
应该是端口被占用造成的。

打开操作系统终端,输入如下命令试试:

lsof -i:9777 | awk '{print $2}' | tail -n +2 | xargs kill -9
收起阅读 »

仅在某页面h5隐藏顶部栏,app不隐藏的实现方法

本来以为在某个页面里放这段代码即可隐藏:

/* #ifdef H5 */  
uni-page-head { display: none}  
/* #endif */

经过试验发现放页面的<style>标签里没效果,放App.vue里有效果,但是放App.vue里所有的页面H5都没顶部栏了。

最终只能找个折中的方法,在需要隐藏顶部栏的页面里,onLoad执行

// #ifdef H5  
document.getElementsByTagName('uni-page-head')[0].style.display = 'none'  
// #endif

但是这个方法在网页打开时会闪一下。
其实在页面里放uni-page-head { display: none}如果能有效果的话,是最好的,但是不知道为什么无效。

知道的大神可以指点一下。

继续阅读 »

本来以为在某个页面里放这段代码即可隐藏:

/* #ifdef H5 */  
uni-page-head { display: none}  
/* #endif */

经过试验发现放页面的<style>标签里没效果,放App.vue里有效果,但是放App.vue里所有的页面H5都没顶部栏了。

最终只能找个折中的方法,在需要隐藏顶部栏的页面里,onLoad执行

// #ifdef H5  
document.getElementsByTagName('uni-page-head')[0].style.display = 'none'  
// #endif

但是这个方法在网页打开时会闪一下。
其实在页面里放uni-page-head { display: none}如果能有效果的话,是最好的,但是不知道为什么无效。

知道的大神可以指点一下。

收起阅读 »

视频+图片轮播,多个视频,多张图片。

nvue subNVues


这里需要做个判断是微信小程序还是app,因为小程序才有stop功能,app只有pause暂停。
// #ifdef APP-PLUS
this.$refs['myVideo' + 下标][0].pause()
// #endif
// #ifndef APP-PLUS
uni.createVideoContext('myVideo' + 下标).stop()
// #endif

uniapp文档写着uni.createVideoContext也支持app的,但是我在app安卓端使用uni.createVideoContext来获取视频组件,发现是undefined,所以就使用ref了。

这样就可以做到上下滑动类似抖音火山视频那种 ,或者左右滑动的轮播了。因为video在nvue或者原子窗subnvue,video层级不是最高了。

继续阅读 »


这里需要做个判断是微信小程序还是app,因为小程序才有stop功能,app只有pause暂停。
// #ifdef APP-PLUS
this.$refs['myVideo' + 下标][0].pause()
// #endif
// #ifndef APP-PLUS
uni.createVideoContext('myVideo' + 下标).stop()
// #endif

uniapp文档写着uni.createVideoContext也支持app的,但是我在app安卓端使用uni.createVideoContext来获取视频组件,发现是undefined,所以就使用ref了。

这样就可以做到上下滑动类似抖音火山视频那种 ,或者左右滑动的轮播了。因为video在nvue或者原子窗subnvue,video层级不是最高了。

收起阅读 »

最新 App store 上架教程(uni-app版)

Appstore上传 iOS iOS打包 Appstore

利用uni-app 开发的iOS app 发布到App Store全流程

本笔记记录了本人利用HBuilderX 开发uni-app项目到打包iOS app包后,上架App Store商店详细全过程步骤,希望对有需要的小伙伴给予些许帮助。

因该markdown排版不兼容问题,文章会跳转至 有道云 在线分享链接中 阅读原文

原文截图:

最新 App store 上架教程(uni-app版) - Release Notes


1.0.3 20200927

1.0.2 20200925

  • 新增首次驳回拒绝邮件解决措施。

1.0.1 20200922

  • 首次提交关于App Store上架步骤流程:
    兼容检查 -> 账号申请 -> 证书申请 -> 发布准备 -> App Store上架 -> 审核后续
  • 提交审核iOS审核团队联系方式;
继续阅读 »

利用uni-app 开发的iOS app 发布到App Store全流程

本笔记记录了本人利用HBuilderX 开发uni-app项目到打包iOS app包后,上架App Store商店详细全过程步骤,希望对有需要的小伙伴给予些许帮助。

因该markdown排版不兼容问题,文章会跳转至 有道云 在线分享链接中 阅读原文

原文截图:

最新 App store 上架教程(uni-app版) - Release Notes


1.0.3 20200927

1.0.2 20200925

  • 新增首次驳回拒绝邮件解决措施。

1.0.1 20200922

  • 首次提交关于App Store上架步骤流程:
    兼容检查 -> 账号申请 -> 证书申请 -> 发布准备 -> App Store上架 -> 审核后续
  • 提交审核iOS审核团队联系方式;
收起阅读 »

uni-app 项目支持 vue 3.0 介绍,及升级指南

vite vue3

简介

HBuilderX 3.3.0+ 更新uni-app编译器,支持基于 Vite 编译到小程序平台。

至此,uni-appApp/H5/小程序全平台支持Vue 3.0开发,且全平台支持Vite编译器,下载 HBuilderX 3.3.0+ 体验

Tips:

除支持 vue3 语法特性外,uni-app 特有的生命周期钩子支持 Composition API,如 onLaunchonShowonLoad... ,使用方法见 Vue2 迁移 Vue3 文档

HBuilderX创建支持 vue3 的 uni-app 项目

从 HBuilderX 3.3.0+ 起,支持创建 vue3 的 uni-app 项目,一套代码运行到多端:

  1. 创建一个 uni-app 项目

  2. 在项目的 manifest 的「基础配置」中切换 「vue 版本选择」,默认是 vue2,切换为 vue3 即可

cli 创建支持 vue3 的 uni-app 项目

  1. 创建 Vue3/Vite 工程

    # 创建以 javascript 开发的工程  
    npx degit dcloudio/uni-preset-vue#vite my-vue3-project  
    
    # 创建以 typescript 开发的工程  
    npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project  
  2. 进入工程目录

    cd my-vue3-project  
  3. 安装依赖

    npm i  或  yarn  
  4. 运行

    # 运行到 h5   
    npm run dev:h5  
    # 运行到 app   
    npm run dev:app  
    # 运行到 微信小程序  
    npm run dev:mp-weixin  
  5. 打包

    # 打包到 h5   
    npm run build:h5  
    # 打包到 app   
    npm run build:app  
    # 打包到 微信小程序  
    npm run build:mp-weixin  

更新依赖版本

参考:https://uniapp.dcloud.net.cn/quickstart-cli.html#cliversion

从 vue2 迁移到 vue3

请参看官方文档从 vue2 迁移到 vue3

注意事项

  • vue3 响应式基于 Proxy 实现,不支持iOS9和ie11。vue3 中文文档
  • 暂不支持新增的 Teleport,Suspense 组件。
  • 在 Vue3 中, 处理 API Promise 化 调用结果的方式不同于 Vue2。更多
    • Vue3 中,调用成功会进入 then 方法,调用失败会进入 catch 方法
    • Vue2 中,调用无论成功还是失败,都会进入 then 方法,返回数据的第一个参数是错误对象,第二个参数是返回数据

欢迎开发者反馈使用该版本遇到的问题,我们将积极收集意见。

继续阅读 »

简介

HBuilderX 3.3.0+ 更新uni-app编译器,支持基于 Vite 编译到小程序平台。

至此,uni-appApp/H5/小程序全平台支持Vue 3.0开发,且全平台支持Vite编译器,下载 HBuilderX 3.3.0+ 体验

Tips:

除支持 vue3 语法特性外,uni-app 特有的生命周期钩子支持 Composition API,如 onLaunchonShowonLoad... ,使用方法见 Vue2 迁移 Vue3 文档

HBuilderX创建支持 vue3 的 uni-app 项目

从 HBuilderX 3.3.0+ 起,支持创建 vue3 的 uni-app 项目,一套代码运行到多端:

  1. 创建一个 uni-app 项目

  2. 在项目的 manifest 的「基础配置」中切换 「vue 版本选择」,默认是 vue2,切换为 vue3 即可

cli 创建支持 vue3 的 uni-app 项目

  1. 创建 Vue3/Vite 工程

    # 创建以 javascript 开发的工程  
    npx degit dcloudio/uni-preset-vue#vite my-vue3-project  
    
    # 创建以 typescript 开发的工程  
    npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project  
  2. 进入工程目录

    cd my-vue3-project  
  3. 安装依赖

    npm i  或  yarn  
  4. 运行

    # 运行到 h5   
    npm run dev:h5  
    # 运行到 app   
    npm run dev:app  
    # 运行到 微信小程序  
    npm run dev:mp-weixin  
  5. 打包

    # 打包到 h5   
    npm run build:h5  
    # 打包到 app   
    npm run build:app  
    # 打包到 微信小程序  
    npm run build:mp-weixin  

更新依赖版本

参考:https://uniapp.dcloud.net.cn/quickstart-cli.html#cliversion

从 vue2 迁移到 vue3

请参看官方文档从 vue2 迁移到 vue3

注意事项

  • vue3 响应式基于 Proxy 实现,不支持iOS9和ie11。vue3 中文文档
  • 暂不支持新增的 Teleport,Suspense 组件。
  • 在 Vue3 中, 处理 API Promise 化 调用结果的方式不同于 Vue2。更多
    • Vue3 中,调用成功会进入 then 方法,调用失败会进入 catch 方法
    • Vue2 中,调用无论成功还是失败,都会进入 then 方法,返回数据的第一个参数是错误对象,第二个参数是返回数据

欢迎开发者反馈使用该版本遇到的问题,我们将积极收集意见。

收起阅读 »

关于华为的HSM生态系统

HMS生态已经有不少的好功能了,不知道有志同道合的朋友一起研究开发一版uni的插件系统吗?

HMS生态已经有不少的好功能了,不知道有志同道合的朋友一起研究开发一版uni的插件系统吗?

APP端 选择视频的时候没有封面或者缩略图,这里调用安卓原生生成视频缩略图代码

生成jpg 格式缩略图,以视频名称命名并保存在视频旁边,如果已经有图片,则直接范围图片路径.
Navit.js

async getAndroidVideoThumb(path)  
{  
                path=plus.io.convertLocalFileSystemURL( path);  
        var pathns=path.split(".");  
        pathns[pathns.length-1]="jpg";  
        var imgpath=pathns.join(".");  
        var File = plus.android.importClass("java.io.File");  
        var file = new File(imgpath);  
        if(file.exists())return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
        var FileOutputStream  = plus.android.importClass("java.io.FileOutputStream");  
        var outputStream = new FileOutputStream(file);  
        var Bitmap = plus.android.importClass("android.graphics.Bitmap");  
        var thum=plus.android.invoke("android.media.ThumbnailUtils","createVideoThumbnail",path,1);  
        var result= plus.android.invoke(thum,"compress",Bitmap.CompressFormat.JPEG,100,outputStream);  
        if(!result)return null;  
        plus.android.invoke(thum,"recycle");  
        thum=null;  
        plus.android.invoke(outputStream,"flush");  
        plus.android.invoke(outputStream,"close");  
        return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
}
继续阅读 »

生成jpg 格式缩略图,以视频名称命名并保存在视频旁边,如果已经有图片,则直接范围图片路径.
Navit.js

async getAndroidVideoThumb(path)  
{  
                path=plus.io.convertLocalFileSystemURL( path);  
        var pathns=path.split(".");  
        pathns[pathns.length-1]="jpg";  
        var imgpath=pathns.join(".");  
        var File = plus.android.importClass("java.io.File");  
        var file = new File(imgpath);  
        if(file.exists())return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
        var FileOutputStream  = plus.android.importClass("java.io.FileOutputStream");  
        var outputStream = new FileOutputStream(file);  
        var Bitmap = plus.android.importClass("android.graphics.Bitmap");  
        var thum=plus.android.invoke("android.media.ThumbnailUtils","createVideoThumbnail",path,1);  
        var result= plus.android.invoke(thum,"compress",Bitmap.CompressFormat.JPEG,100,outputStream);  
        if(!result)return null;  
        plus.android.invoke(thum,"recycle");  
        thum=null;  
        plus.android.invoke(outputStream,"flush");  
        plus.android.invoke(outputStream,"close");  
        return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
}
收起阅读 »

tabber底部导航切换页面

导航栏

uniapp制作微信小程序 不管是自带的tabber底部导航栏还是自定义的都会出现切换页面会一闪一闪的.

复现:安卓手机上的微信小程序,

ios不会出现 , 安卓手机app也不会出现 安卓的小程序会出现切换闪一下
这是uniapp的bug吗?

uniapp制作微信小程序 不管是自带的tabber底部导航栏还是自定义的都会出现切换页面会一闪一闪的.

复现:安卓手机上的微信小程序,

ios不会出现 , 安卓手机app也不会出现 安卓的小程序会出现切换闪一下
这是uniapp的bug吗?

HBuilder无法检测到手机,解决办法!!

adb 真机调试

参考官方说明内容:
如果其他软件能检测到手机,但是HBuilder无法检测到,将HBuilder安装目录下的tools目录(MAC下为HBuilder.app/Contents/tools目录)下的文件备份,然后将tools\1.0.31目录下的文件拷贝到tools目录下,重启HBuilder

继续阅读 »

参考官方说明内容:
如果其他软件能检测到手机,但是HBuilder无法检测到,将HBuilder安装目录下的tools目录(MAC下为HBuilder.app/Contents/tools目录)下的文件备份,然后将tools\1.0.31目录下的文件拷贝到tools目录下,重启HBuilder

收起阅读 »

安卓微信支付报错{"errMsg":"requestPayment:fail errors"}支付的坑

支付 微信支付

首先app和小程序支付的参数不一样,小程序是驼峰的,app不是

小程序的是:appId,signType,timeStamp,nonceStr,package
app的是:appid,partnerid,prepayid,noncestr,timestamp,package

var orderInfo = {
"appid":res.data.appId,
"noncestr":res.data.nonceStr,
"package":res.data.packageValue,
partnerid":res.data.partnerId,
"prepayid":res.data.prepayId,
"timestamp":res.data.timeStamp,
"sign":res.data.sign
}

uni.requestPayment({
provider: 'wxpay',
orderInfo: orderInfo, //微信 订单数据

然后就可以调起支付了,当然,你需要看看,你签名对不对
校验接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1

继续阅读 »

首先app和小程序支付的参数不一样,小程序是驼峰的,app不是

小程序的是:appId,signType,timeStamp,nonceStr,package
app的是:appid,partnerid,prepayid,noncestr,timestamp,package

var orderInfo = {
"appid":res.data.appId,
"noncestr":res.data.nonceStr,
"package":res.data.packageValue,
partnerid":res.data.partnerId,
"prepayid":res.data.prepayId,
"timestamp":res.data.timeStamp,
"sign":res.data.sign
}

uni.requestPayment({
provider: 'wxpay',
orderInfo: orderInfo, //微信 订单数据

然后就可以调起支付了,当然,你需要看看,你签名对不对
校验接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1

收起阅读 »

Error: [JS Framework] Failed to receiveTasks, instance (14) is not available.

这个超过1就得考虑使用的组件是否有定时器没有清除加速了或者出现死循环

这个超过1就得考虑使用的组件是否有定时器没有清除加速了或者出现死循环

二维码生成为空白

二维码生成不了大多都是val属性没有绑定到值所引起的,在hospital-qrcode页面有一个反例可以参考.
这个页面生成不了二维码的主要原因是路由传参的值需要在onLoad中获取,但事先需要在data()中定义这个对
象,在created时初始化了对象.生命周期顺序:created->onLoad->qrcode mounted->mouted

    ...  
    data() {  
        patientInfo: {}  
    }  
    ...
这就造成了`tki-qrcode`组件在`mounted`的时候获取的`val`是`undefined`(patientInfo.qrcode=undefined)  
,以下为`tki-qrcode`挂载源码  
```javacript  
mounted: function () {  
    if (this.loadMake) {  
        if (!this._empty(this.val)) { // -> val为undefined,就不会执行_makeCode()函数  
            setTimeout(() => {  
                this._makeCode()  
            }, 0);  
        }  
    }  
}  
```  
所以呢,需要给`tki-qrcode`新增一个属性`:onval="true"`,在`onLoad`后`patientInfo`对象有了数据  
,`val`会重新绑定值,自动生成二维码.  
                    <view class="qrcode">  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" :onval="true">  
                        </tki-qrcode>  
                        <!-- 反例! 二维码不会生成-->  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" >  
                        </tki-qrcode>  
                    </view>
继续阅读 »

二维码生成不了大多都是val属性没有绑定到值所引起的,在hospital-qrcode页面有一个反例可以参考.
这个页面生成不了二维码的主要原因是路由传参的值需要在onLoad中获取,但事先需要在data()中定义这个对
象,在created时初始化了对象.生命周期顺序:created->onLoad->qrcode mounted->mouted

    ...  
    data() {  
        patientInfo: {}  
    }  
    ...
这就造成了`tki-qrcode`组件在`mounted`的时候获取的`val`是`undefined`(patientInfo.qrcode=undefined)  
,以下为`tki-qrcode`挂载源码  
```javacript  
mounted: function () {  
    if (this.loadMake) {  
        if (!this._empty(this.val)) { // -> val为undefined,就不会执行_makeCode()函数  
            setTimeout(() => {  
                this._makeCode()  
            }, 0);  
        }  
    }  
}  
```  
所以呢,需要给`tki-qrcode`新增一个属性`:onval="true"`,在`onLoad`后`patientInfo`对象有了数据  
,`val`会重新绑定值,自动生成二维码.  
                    <view class="qrcode">  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" :onval="true">  
                        </tki-qrcode>  
                        <!-- 反例! 二维码不会生成-->  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" >  
                        </tki-qrcode>  
                    </view>
收起阅读 »