HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

咱们能不能把网站的字体只使用微软雅黑,难看死了!

官网

每次看你们的文档还得单独关闭你们网站的字体设置难受的要命。

每次看你们的文档还得单独关闭你们网站的字体设置难受的要命。

uniapp自定义启动图会出现向上闪动的问题

打包bug

兄弟们 启动图会往上顶一下有没有大佬解决一下

兄弟们 启动图会往上顶一下有没有大佬解决一下

【外包】10+年经验程序员在线接单丶价低丶活好

外包接单 外包

10+年程序员在线接单丶价低丶活好丶前后端都可以开发。

10+年程序员在线接单丶价低丶活好丶前后端都可以开发。

求老板收留?10年开发经验丰富,效率高!全栈开发

求职

可以远程,也可以到公司
vx:a58334605

可以远程,也可以到公司
vx:a58334605

【功能建议】建议在运行自定义发布时,在Console加上当前的自定义发行名称,防止误点,导致一些没必要的麻烦

最近手里有个项目,由于各种环境过多,使用了HbuilderX的自定义发行定义了一堆环境,然后发现运行发布的时候,无法知道是否选择了正确的环境,发布完成之后总是需要测试一下,环境是否正确,由于无法cli运行发布,也无法工程化,导致这里有非常大的风险,并且容易浪费时间

继续阅读 »

最近手里有个项目,由于各种环境过多,使用了HbuilderX的自定义发行定义了一堆环境,然后发现运行发布的时候,无法知道是否选择了正确的环境,发布完成之后总是需要测试一下,环境是否正确,由于无法cli运行发布,也无法工程化,导致这里有非常大的风险,并且容易浪费时间

收起阅读 »

修复vue3项目富文本编辑器editor在iOS低版本上无法编辑的问题

h5 iOS editor

问题现象:

  1. vue3项目编译成h5后,富文本编辑器editor在iOS17上可以正常编辑,在iOS低版本上可以调起键盘,但不显示光标,也无法输入文字
  2. 直接运行时在iOS低版本上可以输入,编译成h5后就无法输入了

解决方法:

  1. 在调用editor的页面添加样式:
    > div * {
    -webkit-user-select: text;
    outline: none; // 这个视情况而定
    }
继续阅读 »

问题现象:

  1. vue3项目编译成h5后,富文本编辑器editor在iOS17上可以正常编辑,在iOS低版本上可以调起键盘,但不显示光标,也无法输入文字
  2. 直接运行时在iOS低版本上可以输入,编译成h5后就无法输入了

解决方法:

  1. 在调用editor的页面添加样式:
    > div * {
    -webkit-user-select: text;
    outline: none; // 这个视情况而定
    }
收起阅读 »

鸿蒙Next版聊天app实例|ArkTs+ArkUI仿微信

鸿蒙 鸿蒙next harmony

历经一个月有余爆肝高强度开发,原创重磅新作HarmonyOS 5.0 api12聊天app项目正式完结了。

HarmonyOS-Next5.0-API12仿微信聊天App应用

img

img

项目框架目录

img

img

img

HarmonyOS-Chat聊天app已经同步到我的原创作品集。

https://gf.bilibili.com/item/detail/1107424011

img

想要更快进阶鸿蒙开发,先把官方文档撸一遍,然后找个实战项目学习。

img

鸿蒙os开发者官网
https://developer.huawei.com/consumer/cn/

img

img

img

img

img

img

img

img

img

img

img

img

img

路由页面json文件

img

arkts/arkui封装自定义导航栏

img

之前有写过一篇专门的分享介绍,感兴趣的可以去看看下面这篇文章。
https://www.cnblogs.com/xiaoyan2017/p/18517517

arkts/arkui登录模板/倒计时

img

/**  
 * 登录模板  
 * @author andy  
 */  

import { router, promptAction } from '@kit.ArkUI'  

@Entry  
@Component  
struct Login {  
  @State name: string = ''  
  @State pwd: string = ''  

  // 提交  
  handleSubmit() {  
    if(this.name === '' || this.pwd === '') {  
      promptAction.showToast({ message: '账号或密码不能为空' })  
    }else {  
      // 登录接口逻辑...  

      promptAction.showToast({ message: '登录成功' })  
      setTimeout(() => {  
        router.replaceUrl({ url: 'pages/Index' })  
      }, 2000)  
    }  
  }  

  build() {  
    Column() {  
      Column({space: 10}) {  
        Image('pages/assets/images/logo.png').height(50).width(50)  
        Text('HarmonyOS-Chat').fontSize(18).fontColor('#0a59f7')  
      }  
      .margin({top: 50})  
      Column({space: 15}) {  
        TextInput({placeholder: '请输入账号'})  
          .onChange((value) => {  
            this.name = value  
          })  
        TextInput({placeholder: '请输入密码'}).type(InputType.Password)  
          .onChange((value) => {  
            this.pwd = value  
          })  
        Button('登录').height(45).width('100%')  
          .linearGradient({ angle: 135, colors: [['#0a59f7', 0.1], ['#07c160', 1]] })  
          .onClick(() => {  
            this.handleSubmit()  
          })  
      }  
      .margin({top: 30})  
      .width('80%')  
      Row({space: 15}) {  
        Text('忘记密码').fontSize(14).opacity(0.5)  
        Text('注册账号').fontSize(14).opacity(0.5)  
          .onClick(() => {  
            router.pushUrl({url: 'pages/views/auth/Register'})  
          })  
      }  
      .margin({top: 20})  
    }  
    .height('100%')  
    .width('100%')  
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])  
  }  
}

60s倒计时功能
img

Stack({alignContent: Alignment.End}) {  
  TextInput({placeholder: '验证码'})  
    .onChange((value) => {  
      this.code = value  
    })  
  Button(`${this.codeText}`).enabled(!this.disabled).controlSize(ControlSize.SMALL).margin({right: 5})  
    .onClick(() => {  
      this.handleVCode()  
    })  
}  

// 验证码参数  
@State codeText: string = '获取验证码'  
@State disabled: boolean = false  
@State time: number = 60  

// 获取验证码  
handleVCode() {  
  if(this.tel === '') {  
    promptAction.showToast({ message: '请输入手机号' })  
  }else if(!checkMobile(this.tel)) {  
    promptAction.showToast({ message: '手机号格式错误' })  
  }else {  
    const timer = setInterval(() => {  
      if(this.time > 0) {  
        this.disabled = true  
        this.codeText = `获取验证码(${this.time--})`  
      }else {  
        clearInterval(timer)  
        this.codeText = '获取验证码'  
        this.time = 5  
        this.disabled = false  
      }  
    }, 1000)  
  }  
}

harmony-chat聊天app项目涉及知识点很多,对于想要快速入门到进阶开发HarmonyOS应用的开发者,建议先阅读官方文档,然后再找一个实战项目案例进行练习。华为官网提供了HarmonyOS开发设计规范和ArkUI方舟UI框架的相关资料,这些都是宝贵的开发资源

作者:xiaoyan2017
链接: https://segmentfault.com/a/1190000045487385
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

继续阅读 »

历经一个月有余爆肝高强度开发,原创重磅新作HarmonyOS 5.0 api12聊天app项目正式完结了。

HarmonyOS-Next5.0-API12仿微信聊天App应用

img

img

项目框架目录

img

img

img

HarmonyOS-Chat聊天app已经同步到我的原创作品集。

https://gf.bilibili.com/item/detail/1107424011

img

想要更快进阶鸿蒙开发,先把官方文档撸一遍,然后找个实战项目学习。

img

鸿蒙os开发者官网
https://developer.huawei.com/consumer/cn/

img

img

img

img

img

img

img

img

img

img

img

img

img

路由页面json文件

img

arkts/arkui封装自定义导航栏

img

之前有写过一篇专门的分享介绍,感兴趣的可以去看看下面这篇文章。
https://www.cnblogs.com/xiaoyan2017/p/18517517

arkts/arkui登录模板/倒计时

img

/**  
 * 登录模板  
 * @author andy  
 */  

import { router, promptAction } from '@kit.ArkUI'  

@Entry  
@Component  
struct Login {  
  @State name: string = ''  
  @State pwd: string = ''  

  // 提交  
  handleSubmit() {  
    if(this.name === '' || this.pwd === '') {  
      promptAction.showToast({ message: '账号或密码不能为空' })  
    }else {  
      // 登录接口逻辑...  

      promptAction.showToast({ message: '登录成功' })  
      setTimeout(() => {  
        router.replaceUrl({ url: 'pages/Index' })  
      }, 2000)  
    }  
  }  

  build() {  
    Column() {  
      Column({space: 10}) {  
        Image('pages/assets/images/logo.png').height(50).width(50)  
        Text('HarmonyOS-Chat').fontSize(18).fontColor('#0a59f7')  
      }  
      .margin({top: 50})  
      Column({space: 15}) {  
        TextInput({placeholder: '请输入账号'})  
          .onChange((value) => {  
            this.name = value  
          })  
        TextInput({placeholder: '请输入密码'}).type(InputType.Password)  
          .onChange((value) => {  
            this.pwd = value  
          })  
        Button('登录').height(45).width('100%')  
          .linearGradient({ angle: 135, colors: [['#0a59f7', 0.1], ['#07c160', 1]] })  
          .onClick(() => {  
            this.handleSubmit()  
          })  
      }  
      .margin({top: 30})  
      .width('80%')  
      Row({space: 15}) {  
        Text('忘记密码').fontSize(14).opacity(0.5)  
        Text('注册账号').fontSize(14).opacity(0.5)  
          .onClick(() => {  
            router.pushUrl({url: 'pages/views/auth/Register'})  
          })  
      }  
      .margin({top: 20})  
    }  
    .height('100%')  
    .width('100%')  
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])  
  }  
}

60s倒计时功能
img

Stack({alignContent: Alignment.End}) {  
  TextInput({placeholder: '验证码'})  
    .onChange((value) => {  
      this.code = value  
    })  
  Button(`${this.codeText}`).enabled(!this.disabled).controlSize(ControlSize.SMALL).margin({right: 5})  
    .onClick(() => {  
      this.handleVCode()  
    })  
}  

// 验证码参数  
@State codeText: string = '获取验证码'  
@State disabled: boolean = false  
@State time: number = 60  

// 获取验证码  
handleVCode() {  
  if(this.tel === '') {  
    promptAction.showToast({ message: '请输入手机号' })  
  }else if(!checkMobile(this.tel)) {  
    promptAction.showToast({ message: '手机号格式错误' })  
  }else {  
    const timer = setInterval(() => {  
      if(this.time > 0) {  
        this.disabled = true  
        this.codeText = `获取验证码(${this.time--})`  
      }else {  
        clearInterval(timer)  
        this.codeText = '获取验证码'  
        this.time = 5  
        this.disabled = false  
      }  
    }, 1000)  
  }  
}

harmony-chat聊天app项目涉及知识点很多,对于想要快速入门到进阶开发HarmonyOS应用的开发者,建议先阅读官方文档,然后再找一个实战项目案例进行练习。华为官网提供了HarmonyOS开发设计规范和ArkUI方舟UI框架的相关资料,这些都是宝贵的开发资源

作者:xiaoyan2017
链接: https://segmentfault.com/a/1190000045487385
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

收起阅读 »

建议:HBuilderX全局书签功能

建议:HBuilderX全局书签功能
HBuilderX书签,当前好像只能从本本文档内有效?
实际开发时,经常需要几个文档的指定位置分别编辑。能否定义全局书签,可直接跳转到另一个文档的书签位置?

建议:HBuilderX全局书签功能
HBuilderX书签,当前好像只能从本本文档内有效?
实际开发时,经常需要几个文档的指定位置分别编辑。能否定义全局书签,可直接跳转到另一个文档的书签位置?

真机运行跳转正常,但是“打包和上线”都失败报错bad_param

uniapp开发的app 跳转微信小程序 我在manifest.json分享权限配置的appid 是微信开放平台移动应用的appid
使用的是5+launchMiniProgram ID为小程序的原始id

真机运行跳转正常,但是“打包和上线”都失败报错bad_param
下面是代码块

const originId = 'gh_1ae' // 微信小程序原始id
const path = PalyUrl.value // 小程序页面路径
const envVersion = import.meta.env.VITE_APP_VERSION // 0-正式版; 1-测试版; 2-体验版
const webUrl = 'https://www.dcloud.io/hbuilderx.html' // 兼容低版本的网页链接

plus.share.getServices(service => {  
  const weixin = service.find(i => i.id === 'weixin')  
  if (weixin) {  
    weixin.launchMiniProgram({  
      id: originId,  
      path,  
      type: envVersion,  
      webUrl  
    }, res => {  
      console.log('res', res)  
    }, err => {  
      console.log('err', err)  
    })
继续阅读 »

uniapp开发的app 跳转微信小程序 我在manifest.json分享权限配置的appid 是微信开放平台移动应用的appid
使用的是5+launchMiniProgram ID为小程序的原始id

真机运行跳转正常,但是“打包和上线”都失败报错bad_param
下面是代码块

const originId = 'gh_1ae' // 微信小程序原始id
const path = PalyUrl.value // 小程序页面路径
const envVersion = import.meta.env.VITE_APP_VERSION // 0-正式版; 1-测试版; 2-体验版
const webUrl = 'https://www.dcloud.io/hbuilderx.html' // 兼容低版本的网页链接

plus.share.getServices(service => {  
  const weixin = service.find(i => i.id === 'weixin')  
  if (weixin) {  
    weixin.launchMiniProgram({  
      id: originId,  
      path,  
      type: envVersion,  
      webUrl  
    }, res => {  
      console.log('res', res)  
    }, err => {  
      console.log('err', err)  
    })
收起阅读 »

微信公众号分享,永远是链接不是卡片模式的原因

做的 H5 的项目,分享所有的测试都正常。微信开发者工具也没有报错, 在真实线上也没有报错。但分享出来都是链接。

有几点要注意。

  1. 分享的链接,在 js-sdk 中配置的分享链接,必须和当前的网页一样,尽早初始化。
  2. 微信开放全域名访问后出现的限制。只能是 公众号菜单进入分享、扫描二维码后分享、添加到收藏,从微信我的收藏进入分享, 只有这几种情况是正常的。其他地方进入,如发链接给别人,这时然后分享出来时都会是链接。这个没有任何公开的文档提到这个。巨坑之一。TMD 微信。
继续阅读 »

做的 H5 的项目,分享所有的测试都正常。微信开发者工具也没有报错, 在真实线上也没有报错。但分享出来都是链接。

有几点要注意。

  1. 分享的链接,在 js-sdk 中配置的分享链接,必须和当前的网页一样,尽早初始化。
  2. 微信开放全域名访问后出现的限制。只能是 公众号菜单进入分享、扫描二维码后分享、添加到收藏,从微信我的收藏进入分享, 只有这几种情况是正常的。其他地方进入,如发链接给别人,这时然后分享出来时都会是链接。这个没有任何公开的文档提到这个。巨坑之一。TMD 微信。
收起阅读 »

uni.login 你所不知道的坑

iOS打包 微信登录

使用uni.login调用微信登录小程序、安卓App一路都很顺畅,但到了IOS,出现一个奇葩的事件,先来看,就是一段简单的登录代码

uni.login({  
    provider: 'weixin',  
    onlyAuthorize: true,  
    success: (res2) => {  
         console.log('getUserProfile:------4.')  
    },  
    fail: (res) => {  
          console.log('loginWechat.fail:', res)  
    },  
    complete:(res)=>{  
         console.log('..................')  
    }  
});

在自定义基座的情况,如果你是在HbuilderX中调用基座执行,那么你会发现,无论任何情况,上面的代码执行都不会有问题。但如果你切换到Xcode中执行,那么问题来了,你首次调用uni.login时,也能正常返回,但如果第二次调用(30秒内调用),你会发现不管是success、fail、complete,三者不会有任何输出,也就是uni.login调用失败。那么,如何再次成功调用呢?答案是等30秒,为啥要等30秒呢?在30秒后,在Xcode中会输出一段警告日志,如下:

Background Task 3 ("Called by HBuilder, from -[AppDelegate applicationDidEnterBackground:]"), was created over 30 seconds ago. In applications running in the background, this creates a risk of termination. Remember to call UIApplication.endBackgroundTask(_:) for your task in a timely manner to avoid this.

你只能看到该日志输出后,你再次调用uni.login才会正常,我非专业的IOS开发,大体了解了一下,也就是说SDK中调用beginBackgroundTask,没有调用 endBackgroundTask,这个BUG有什么好的解决方法呢?还是说我哪没配置对?

继续阅读 »

使用uni.login调用微信登录小程序、安卓App一路都很顺畅,但到了IOS,出现一个奇葩的事件,先来看,就是一段简单的登录代码

uni.login({  
    provider: 'weixin',  
    onlyAuthorize: true,  
    success: (res2) => {  
         console.log('getUserProfile:------4.')  
    },  
    fail: (res) => {  
          console.log('loginWechat.fail:', res)  
    },  
    complete:(res)=>{  
         console.log('..................')  
    }  
});

在自定义基座的情况,如果你是在HbuilderX中调用基座执行,那么你会发现,无论任何情况,上面的代码执行都不会有问题。但如果你切换到Xcode中执行,那么问题来了,你首次调用uni.login时,也能正常返回,但如果第二次调用(30秒内调用),你会发现不管是success、fail、complete,三者不会有任何输出,也就是uni.login调用失败。那么,如何再次成功调用呢?答案是等30秒,为啥要等30秒呢?在30秒后,在Xcode中会输出一段警告日志,如下:

Background Task 3 ("Called by HBuilder, from -[AppDelegate applicationDidEnterBackground:]"), was created over 30 seconds ago. In applications running in the background, this creates a risk of termination. Remember to call UIApplication.endBackgroundTask(_:) for your task in a timely manner to avoid this.

你只能看到该日志输出后,你再次调用uni.login才会正常,我非专业的IOS开发,大体了解了一下,也就是说SDK中调用beginBackgroundTask,没有调用 endBackgroundTask,这个BUG有什么好的解决方法呢?还是说我哪没配置对?

收起阅读 »

uni-registerRequestPermissionTips插件的ts类型定义

uts插件 插件讨论

由于在基于ts开发项目中直接引用uts插件会出现类型报错问题,但插件实际是正常的,所以这里提供一份uni-registerRequestPermissionTips的类型声明文件,解决类型报错问题。

文件名可以起名为uni-registerRequestPermissionTips.d.ts,丢到项目公共的类型目录即可。


declare module '@/uni_modules/uni-registerRequestPermissionTips'{  
  export interface RequestPermissionTipsListener {  
    /**  
     * 申请系统权限回调,permissions为触发权限申请的所有权限  
     */  
    onRequest?: ((permissions: Array<'grant' | 'denied'>) => void) | null  
    /**  
     * 弹出系统权限授权框回调,permissions为触发弹出权限授权框的所有权限  
     */  
    onConfirm?: ((permission: Array<'grant' | 'denied'>) => void) | null  
    /**  
     * 权限申请完成回调,permissions包括权限及权限的状态。  
     *  
     * grant为权限已获取,denied为权限已拒绝  
     */  
    onComplete?: ((permissions: Record<string, 'grant' | 'denied'>) => void) | null  
  }  
  export type RegisterRequestPermissionTipsListener = (listener: RequestPermissionTipsListener | null) => void  
  export type UnregisterRequestPermissionTipsListener = (listener: RequestPermissionTipsListener | null) => void  
  export type SetRequestPermissionTips = (tips: Record<string, string>) => void  
  /**  
   * 注册权限监听器。  
   *  
   * @see https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips  
   */  
  export const registerRequestPermissionTipsListener: RegisterRequestPermissionTipsListener  
  /**  
   * 设置权限监听的说明。支持针对权限设置具体的说明。  
   *  
   * @see https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips  
   */  
  export const setRequestPermissionTips: SetRequestPermissionTips  
  /**  
   * 注销权限监听器。  
   *  
   * @see https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips  
   *  
   */  
  export const unregisterRequestPermissionTipsListener: UnregisterRequestPermissionTipsListener  
}  
继续阅读 »

由于在基于ts开发项目中直接引用uts插件会出现类型报错问题,但插件实际是正常的,所以这里提供一份uni-registerRequestPermissionTips的类型声明文件,解决类型报错问题。

文件名可以起名为uni-registerRequestPermissionTips.d.ts,丢到项目公共的类型目录即可。


declare module '@/uni_modules/uni-registerRequestPermissionTips'{  
  export interface RequestPermissionTipsListener {  
    /**  
     * 申请系统权限回调,permissions为触发权限申请的所有权限  
     */  
    onRequest?: ((permissions: Array<'grant' | 'denied'>) => void) | null  
    /**  
     * 弹出系统权限授权框回调,permissions为触发弹出权限授权框的所有权限  
     */  
    onConfirm?: ((permission: Array<'grant' | 'denied'>) => void) | null  
    /**  
     * 权限申请完成回调,permissions包括权限及权限的状态。  
     *  
     * grant为权限已获取,denied为权限已拒绝  
     */  
    onComplete?: ((permissions: Record<string, 'grant' | 'denied'>) => void) | null  
  }  
  export type RegisterRequestPermissionTipsListener = (listener: RequestPermissionTipsListener | null) => void  
  export type UnregisterRequestPermissionTipsListener = (listener: RequestPermissionTipsListener | null) => void  
  export type SetRequestPermissionTips = (tips: Record<string, string>) => void  
  /**  
   * 注册权限监听器。  
   *  
   * @see https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips  
   */  
  export const registerRequestPermissionTipsListener: RegisterRequestPermissionTipsListener  
  /**  
   * 设置权限监听的说明。支持针对权限设置具体的说明。  
   *  
   * @see https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips  
   */  
  export const setRequestPermissionTips: SetRequestPermissionTips  
  /**  
   * 注销权限监听器。  
   *  
   * @see https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips  
   *  
   */  
  export const unregisterRequestPermissionTipsListener: UnregisterRequestPermissionTipsListener  
}  
收起阅读 »