HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

希望官方可以给picker组件增加农历选择的功能

uniapp

希望官方可以给picker组件增加农历选择的功能

希望官方可以给picker组件增加农历选择的功能

【经验分享】解决打包出现Duplicate class a.a.a.a found in modules

uniapp原生插件 uniapp离线打包 云打包冲突

背景

在某些极端场景下,需要接多个第三方 jar /aar包,但是 jar/aar 包都是各家按自己的规则混淆过的,很容易就出现了两个 jar /aar包中都包含 a.a.a.a 这个类的(前面几个 a 是包名,最后一个 a 是类名)

解决办法

下载新版本 proguard Releases · Guardsquare/proguard

下载后进入bin目录,执行一下操作

  1. 解压aar,得到classes.jar

  2. 然后将classes.jar放到bin目录下

  3. 创建 convert.txt,输入如下内容:

    -injars 'classes.jar'  
    -outjars 'classes-out.jar'  
    
    -dontskipnonpubliclibraryclassmembers  
    -dontshrink  
    -dontoptimize  
    -dontusemixedcaseclassnames  
    # 在这里指定要转换成的包名(将a.a.a替换成的包名)  
    -repackageclasses com.itfenbao  
    -dontpreverify  
    -dontnote  
    -dontwarn  
    -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod  
    
    # 需要注意观察原始 jar 包中哪些是没有混淆的,需要保留  
    -keep class com.** {*;}  
    -keep class vivo.** {*;}  
    # 因为我们的目的只是替换外层包名,类内部的一些东西都不用管  
    -keepclassmembers class ** {*;}  
  4. 执行sh

    ./proguard.sh @convert.txt  
  5. classes-out.jar替换aar解压后的classes.jar

  6. 使用jar cvf 重新打包aar

    jar cvf output.aar -C aar_unzip/ .  
继续阅读 »

背景

在某些极端场景下,需要接多个第三方 jar /aar包,但是 jar/aar 包都是各家按自己的规则混淆过的,很容易就出现了两个 jar /aar包中都包含 a.a.a.a 这个类的(前面几个 a 是包名,最后一个 a 是类名)

解决办法

下载新版本 proguard Releases · Guardsquare/proguard

下载后进入bin目录,执行一下操作

  1. 解压aar,得到classes.jar

  2. 然后将classes.jar放到bin目录下

  3. 创建 convert.txt,输入如下内容:

    -injars 'classes.jar'  
    -outjars 'classes-out.jar'  
    
    -dontskipnonpubliclibraryclassmembers  
    -dontshrink  
    -dontoptimize  
    -dontusemixedcaseclassnames  
    # 在这里指定要转换成的包名(将a.a.a替换成的包名)  
    -repackageclasses com.itfenbao  
    -dontpreverify  
    -dontnote  
    -dontwarn  
    -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod  
    
    # 需要注意观察原始 jar 包中哪些是没有混淆的,需要保留  
    -keep class com.** {*;}  
    -keep class vivo.** {*;}  
    # 因为我们的目的只是替换外层包名,类内部的一些东西都不用管  
    -keepclassmembers class ** {*;}  
  4. 执行sh

    ./proguard.sh @convert.txt  
  5. classes-out.jar替换aar解压后的classes.jar

  6. 使用jar cvf 重新打包aar

    jar cvf output.aar -C aar_unzip/ .  
收起阅读 »

接外包,全栈、前端、后端、个人、团队等 vx:pan123chong

转让项目 外包接单 混合开发

干程序已经干了六七年了,目前在杭州全职接项目、做项目,有需求的或者喜欢交朋友的,欢迎与我联系交流啊,后面人多了就建个微信群

干程序已经干了六七年了,目前在杭州全职接项目、做项目,有需求的或者喜欢交朋友的,欢迎与我联系交流啊,后面人多了就建个微信群

uniapp整包更新和热更新组件升级版 支持vue3 支持打开安卓自带的应用市场和苹果appstore

热更新

一键式检查更新,同时支持整包升级与wgt资源包更新 支持打开安卓自带的应用市场和苹果appstore

好看、实用、可自定义的客户端提示框

支持强制更新,无法退出

插件地址 https://ext.dcloud.net.cn/plugin?id=7286

继续阅读 »

一键式检查更新,同时支持整包升级与wgt资源包更新 支持打开安卓自带的应用市场和苹果appstore

好看、实用、可自定义的客户端提示框

支持强制更新,无法退出

插件地址 https://ext.dcloud.net.cn/plugin?id=7286

收起阅读 »

使用<rich-text>渲染包含<img>标签的富文本,图片显示超出了屏幕的显示范围

富文本 rich_text

使用渲染包含标签的富文本,图片显示超出了屏幕的显示范围

解决方式:

<rich-text :nodes="info.content|replaceContent"/>  
filters: {  
    replaceContent(value) {  
        return value.replace(/<img/g, "<img style='width:100%'");  
    }  
}

继续阅读 »

使用渲染包含标签的富文本,图片显示超出了屏幕的显示范围

解决方式:

<rich-text :nodes="info.content|replaceContent"/>  
filters: {  
    replaceContent(value) {  
        return value.replace(/<img/g, "<img style='width:100%'");  
    }  
}

收起阅读 »

vue-property-decorator 中 Watch 的使用,监控数据组件变化

在前端开发的时候为了方便常会用到组件,这个时候就涉及到传值,并且用input时使用v-model绑定的值需要是本地的备份参数,这就容易引发一个问题,就是当外部值变换后,本地不能及时重新赋值。

这里有篇文章对vue-property-decorator的使用写的非常详细:
https://juejin.cn/post/6844903741456384014

而监控数值变换最顺手的是Watch监控,值得注意是,当我们引用时需要辨别是否import来源正确,因为有很多Watch,所以自动引入容易出现混乱且很难注意到重点是报错不会告诉你(巨坑)需要一个版本一个版本回退才能发现。

正确的import:
import {Vue, Component, Emit, Prop, Watch} from 'vue-property-decorator';

部分代码:

<input v-model="temp_label" :placeholder="placeholder.type" />

@Prop({default: ''}) label!:string;

private temp_label = this.label;

@Watch('label', { immediate: true })
onLabelChanged(val: string, oldVal: string) {
this.temp_label = val;
}

关于Watch的高级用法可以参考这篇文章:
https://segmentfault.com/a/1190000038222430

继续阅读 »

在前端开发的时候为了方便常会用到组件,这个时候就涉及到传值,并且用input时使用v-model绑定的值需要是本地的备份参数,这就容易引发一个问题,就是当外部值变换后,本地不能及时重新赋值。

这里有篇文章对vue-property-decorator的使用写的非常详细:
https://juejin.cn/post/6844903741456384014

而监控数值变换最顺手的是Watch监控,值得注意是,当我们引用时需要辨别是否import来源正确,因为有很多Watch,所以自动引入容易出现混乱且很难注意到重点是报错不会告诉你(巨坑)需要一个版本一个版本回退才能发现。

正确的import:
import {Vue, Component, Emit, Prop, Watch} from 'vue-property-decorator';

部分代码:

<input v-model="temp_label" :placeholder="placeholder.type" />

@Prop({default: ''}) label!:string;

private temp_label = this.label;

@Watch('label', { immediate: true })
onLabelChanged(val: string, oldVal: string) {
this.temp_label = val;
}

关于Watch的高级用法可以参考这篇文章:
https://segmentfault.com/a/1190000038222430

收起阅读 »

uni-app 解决 ios iap 苹果支付 丢单问题

解决思路:
1.苹果支付,没有绑定支付方式,绑定支付方式,然后支付之后,会造成丢单问题,uni.requestPayment,会回调失败,

  1. 拿到小票,进行二次验证,即可解决

主要难点是,怎么拿到小票,现在已经找到方法

有偿提供代码,QQ:543610866

继续阅读 »

解决思路:
1.苹果支付,没有绑定支付方式,绑定支付方式,然后支付之后,会造成丢单问题,uni.requestPayment,会回调失败,

  1. 拿到小票,进行二次验证,即可解决

主要难点是,怎么拿到小票,现在已经找到方法

有偿提供代码,QQ:543610866

收起阅读 »

引入阿里巴巴普惠字体 报错

引入字体

Failed to decode downloaded font: file:///storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/www/static/Alibaba-PuHuiTi-Medium.ttf at __uniappview.html:0

报错的原因应该是字体文件的命名不规范导致 ,简化成 puhuitimedium.ttf 之后就可以了


    @font-face {  
        font-family: AlibabaPuHuiTiMedium;  
        src: url('@/static/puhuitimedium.ttf') format('truetype');  
    }  

如果是画图 canvas的话 参看插件 https://ext.dcloud.net.cn/plugin?id=954

继续阅读 »

Failed to decode downloaded font: file:///storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/www/static/Alibaba-PuHuiTi-Medium.ttf at __uniappview.html:0

报错的原因应该是字体文件的命名不规范导致 ,简化成 puhuitimedium.ttf 之后就可以了


    @font-face {  
        font-family: AlibabaPuHuiTiMedium;  
        src: url('@/static/puhuitimedium.ttf') format('truetype');  
    }  

如果是画图 canvas的话 参看插件 https://ext.dcloud.net.cn/plugin?id=954

收起阅读 »

uniapp ble低功耗蓝牙开发总结

低功耗蓝牙
  1. 在安卓系统中:订阅多个特征值,notifyBLECharacteristicValueChange必须在获取完所有的特征值以后串行notify。notifyBLECharacteristicValueChange成功以后notify第二个特征值,第二个特征值notify成功以后notify第三个特征值...
  2. 在鸿蒙系统中:订阅多个特征值,writeBLECharacteristicValue成功以后无法在onBLECharacteristicValueChange回调中获取到新的特征值变化。需要在writeBLECharacteristicValue成功以后重新notifyBLECharacteristicValueChange需要变化的特征值。
  3. 获取服务需要添加定时器延迟获取,具体时间看设备
  4. 在鸿蒙系统中读特征值property no support 或者 写特征值失败的情况。需要在失败的回调函数中重新读或写

继续阅读 »
  1. 在安卓系统中:订阅多个特征值,notifyBLECharacteristicValueChange必须在获取完所有的特征值以后串行notify。notifyBLECharacteristicValueChange成功以后notify第二个特征值,第二个特征值notify成功以后notify第三个特征值...
  2. 在鸿蒙系统中:订阅多个特征值,writeBLECharacteristicValue成功以后无法在onBLECharacteristicValueChange回调中获取到新的特征值变化。需要在writeBLECharacteristicValue成功以后重新notifyBLECharacteristicValueChange需要变化的特征值。
  3. 获取服务需要添加定时器延迟获取,具体时间看设备
  4. 在鸿蒙系统中读特征值property no support 或者 写特征值失败的情况。需要在失败的回调函数中重新读或写

收起阅读 »

vue3 setup 语法糖中使用uniui popup

popup vue3

官方文档中还有些例子是vue2的写法

下面代码是一个简单的示例,供大家参考。

<template>  
  <view>  
            <view>  
            <!-- 提示信息弹窗 -->  
            <uni-popup ref="message" type="message">  
                <uni-popup-message :type="msgType" :message="messageText" :duration="2000"></uni-popup-message>  
            </uni-popup>  
        </view>  

            <button type="primary" @click="messageToggle('success')">MESSAGE</button>  

  </view>  
</template>  

<script setup>  

    import {  
        ref,  
        onMounted  
    } from 'vue'  

    const message = ref(null)  
    const msgType = ref('')  
    const messageText = ref('')  

    onMounted(()=>{  
        console.log('onMounted')  
        // console.log(message.value)  
    })  
    function messageToggle(type) {  
        msgType.value = type  
        messageText.value = `这是一条${type}消息提示`  
        // this.$refs.message.open()  
        message.value.open()  
    }  
</script>  
继续阅读 »

官方文档中还有些例子是vue2的写法

下面代码是一个简单的示例,供大家参考。

<template>  
  <view>  
            <view>  
            <!-- 提示信息弹窗 -->  
            <uni-popup ref="message" type="message">  
                <uni-popup-message :type="msgType" :message="messageText" :duration="2000"></uni-popup-message>  
            </uni-popup>  
        </view>  

            <button type="primary" @click="messageToggle('success')">MESSAGE</button>  

  </view>  
</template>  

<script setup>  

    import {  
        ref,  
        onMounted  
    } from 'vue'  

    const message = ref(null)  
    const msgType = ref('')  
    const messageText = ref('')  

    onMounted(()=>{  
        console.log('onMounted')  
        // console.log(message.value)  
    })  
    function messageToggle(type) {  
        msgType.value = type  
        messageText.value = `这是一条${type}消息提示`  
        // this.$refs.message.open()  
        message.value.open()  
    }  
</script>  
收起阅读 »

全类型文件选择上传组件-多端支持

上传文件 文件

官方一直不出app端选择非图片视频文件api,没办法只能自己实现了,如果你翻到这篇文章,组件地址给你:

全类型文件选择上传组件地址
https://ext.dcloud.net.cn/plugin?id=5459

继续阅读 »

官方一直不出app端选择非图片视频文件api,没办法只能自己实现了,如果你翻到这篇文章,组件地址给你:

全类型文件选择上传组件地址
https://ext.dcloud.net.cn/plugin?id=5459

收起阅读 »