HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

要使用这个HttpRequest类,您需要先导入它,并创建一个实例对象。然后,您可以使用该实例对象调用各种方法来发送HTTP请求。

以下是使用HttpRequest类的示例代码:


const HttpRequest = require('./HttpRequest'); // 导入HttpRequest类  

const request = new HttpRequest({ // 创建HttpRequest实例  
    baseURL: 'https://api.example.com',  
    errorHandler: (err) => {  
        console.error(err);  
    },  
    tokenKey: 'token',  
    newTokenKey: 'New-Token',  
    refreshURL: '/refresh'  
});  

// 发送GET请求  
request.Get('/users', { page: 1, limit: 10 })  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

// 发送POST请求  
request.Post('/users', { name: 'John', age: 25 })  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

// 发送PUT请求  
request.Put('/users/1', { name: 'John Doe', age: 26 })  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

// 发送DELETE请求  
request.Delete('/users/1')  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

在上面的示例中,我们首先导入了HttpRequest类。然后,我们创建了一个名为request的HttpRequest实例,并传入了一些配置参数。接下来,我们使用该实例调用了Get、Post、Put和Delete方法来发送不同类型的HTTP请求。每个方法都返回一个Promise,我们可以使用.then()来处理成功的响应,使用.catch()来处理错误。

对于文件的上传和下载,您可以使用HttpRequest类中的Download和Upload方法。以下是使用示例:

// 文件下载示例  
const filesToDownload = ['file1.txt', 'file2.txt', 'file3.txt'];  
request.Download('/files/', filesToDownload)  
  .then(filePaths => {  
    console.log('文件下载成功:', filePaths);  
    // 在这里可以对下载的文件进行处理  
  })  
  .catch(error => {  
    console.error('文件下载失败:', error);  
  });  

// 文件上传示例  
const filesToUpload = ['path/to/file1.jpg', 'path/to/file2.jpg', 'path/to/file3.jpg'];  
request.Upload('/upload/', filesToUpload)  
  .then(responseData => {  
    console.log('文件上传成功:', responseData);  
    // 在这里可以对上传成功的响应数据进行处理  
  })  
  .catch(error => {  
    console.error('文件上传失败:', error);  
  });

在上面的示例中,我们首先定义了要下载的文件名数组filesToDownload和要上传的文件路径数组filesToUpload。然后,我们分别使用Download和Upload方法来进行文件的下载和上传操作。

对于文件下载,我们调用Download方法并传入文件的相对路径/files/和要下载的文件名数组filesToDownload。该方法返回一个Promise,当下载成功时,会将临时文件路径数组作为参数传递给.then()回调函数。您可以在回调函数中对下载的文件进行处理。

对于文件上传,我们调用Upload方法并传入文件的相对路径/upload/和要上传的文件路径数组filesToUpload。该方法返回一个Promise,当上传成功时,会将响应数据作为参数传递给.then()回调函数。您可以在回调函数中对上传成功的响应数据进行处理。

请注意,文件下载和上传的路径需要根据您的实际情况进行调整。

继续阅读 »

要使用这个HttpRequest类,您需要先导入它,并创建一个实例对象。然后,您可以使用该实例对象调用各种方法来发送HTTP请求。

以下是使用HttpRequest类的示例代码:


const HttpRequest = require('./HttpRequest'); // 导入HttpRequest类  

const request = new HttpRequest({ // 创建HttpRequest实例  
    baseURL: 'https://api.example.com',  
    errorHandler: (err) => {  
        console.error(err);  
    },  
    tokenKey: 'token',  
    newTokenKey: 'New-Token',  
    refreshURL: '/refresh'  
});  

// 发送GET请求  
request.Get('/users', { page: 1, limit: 10 })  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

// 发送POST请求  
request.Post('/users', { name: 'John', age: 25 })  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

// 发送PUT请求  
request.Put('/users/1', { name: 'John Doe', age: 26 })  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

// 发送DELETE请求  
request.Delete('/users/1')  
    .then(response => {  
        console.log(response);  
    })  
    .catch(error => {  
        console.error(error);  
    });  

在上面的示例中,我们首先导入了HttpRequest类。然后,我们创建了一个名为request的HttpRequest实例,并传入了一些配置参数。接下来,我们使用该实例调用了Get、Post、Put和Delete方法来发送不同类型的HTTP请求。每个方法都返回一个Promise,我们可以使用.then()来处理成功的响应,使用.catch()来处理错误。

对于文件的上传和下载,您可以使用HttpRequest类中的Download和Upload方法。以下是使用示例:

// 文件下载示例  
const filesToDownload = ['file1.txt', 'file2.txt', 'file3.txt'];  
request.Download('/files/', filesToDownload)  
  .then(filePaths => {  
    console.log('文件下载成功:', filePaths);  
    // 在这里可以对下载的文件进行处理  
  })  
  .catch(error => {  
    console.error('文件下载失败:', error);  
  });  

// 文件上传示例  
const filesToUpload = ['path/to/file1.jpg', 'path/to/file2.jpg', 'path/to/file3.jpg'];  
request.Upload('/upload/', filesToUpload)  
  .then(responseData => {  
    console.log('文件上传成功:', responseData);  
    // 在这里可以对上传成功的响应数据进行处理  
  })  
  .catch(error => {  
    console.error('文件上传失败:', error);  
  });

在上面的示例中,我们首先定义了要下载的文件名数组filesToDownload和要上传的文件路径数组filesToUpload。然后,我们分别使用Download和Upload方法来进行文件的下载和上传操作。

对于文件下载,我们调用Download方法并传入文件的相对路径/files/和要下载的文件名数组filesToDownload。该方法返回一个Promise,当下载成功时,会将临时文件路径数组作为参数传递给.then()回调函数。您可以在回调函数中对下载的文件进行处理。

对于文件上传,我们调用Upload方法并传入文件的相对路径/upload/和要上传的文件路径数组filesToUpload。该方法返回一个Promise,当上传成功时,会将响应数据作为参数传递给.then()回调函数。您可以在回调函数中对上传成功的响应数据进行处理。

请注意,文件下载和上传的路径需要根据您的实际情况进行调整。

收起阅读 »

个推消息推送专项运营提升方案5大亮点解读

个推 移动APP 消息推送

今年3月份,个推将数智运营服务在消息推送场景率先落地,发布了消息推送专项运营提升方案。目前,该方案已经在游戏社交、影音资讯等行业应用,在提升消息到达率和点击率等方面表现出显著效果。尤其是TT语音,通过个推消息推送专项运营提升方案,不仅保障了消息的稳定下发,还通过文案圈人模型,高效挖掘目标用户群,使整体消息推送点击率提升了近120%。那么,个推消息推送服务到底如何帮助APP提升消息推送点击率呢?

秘诀一:智选时机,全面提升消息到达率
个推消息推送实现了智选时机,帮助APP在合适的时机下发消息。APP可以使用个推消息推送服务,实时查询设备当前在线状态,对用户属性、设备使用场景等维度综合分析,预测出最佳的用户触达时机。


同时,个推对接了APNs、华为、荣耀、小米、OPPO、vivo、 魅族、坚果、索尼、海信、FCM等十大厂商通道,提供智能配额、离线补发、推送后效分析等能力,有效保障消息的成功下发,助力APP全面提升用户触达效果。

秘诀二:标签圈人,为TA推送专属内容
个推作为一家数据智能服务商,拥有深厚的数据能力,形成了数千种画像标签和亿级别的特征数据,帮助APP精准洞察用户基础属性、兴趣偏好、场景活动特征等,实现精细化的用户分组分群。APP可以使用行为规则、画像标签快速圈选特定人群,并一键对接给个推消息推送平台,针对性推送他们感兴趣的内容,从而吸引用户点击。

秘诀三:模型圈人,AI匹配推送文案和人群
个推还将算法建模的能力融入到消息推送服务中,提供文案圈人模型,让AI学习文案特征,智能预测对该推送文案有更高点击概率的人群,从而实现把合适的内容推送给合适的人群。比如,某数千万级日活泛娱乐APP,使用个推文案圈人模型,高效挖掘目标人群,实现文案与TA用户的精准匹配,使整体消息推送点击率提升了超50%。

秘诀四:富媒体推送样式,吸引用户点击
个推提供大文本、大图、纯图片、消息重弹、角标、换底图、Emoji、消息分组等丰富的推送样式。APP可以创建更有视觉冲击力和吸引力的消息推送样式,从而吸引用户点击。

秘诀五:完整消息链路查询,持续优化推送效果
个推还提供完善的推送数据报表以及消息链路查询等服务。借助快速回流的后效数据,APP一方面可以结合A/B test分组推送等功能,对不同的人群、推送文案、推送时机进行测试对比,帮助优化推送策略;另一方面APP也可以将后效数据“喂”给AI模型继续学习,不断提升模型的预测能力。而在每一次推送和运营活动中表现出高点击、高转化的优质人群和优质文案,APP也可以将其沉淀下来,形成模板,用于下一次的推送或广告投放,持续优化推送效果。

个推消息推送专项运营提升方案围绕用户触达这一环节,将消息推送、数据分析、算法模型等能力以及自身积累的丰富运营经验整合,为APP开展数智化运营提供切实可行的场景入口。

继续阅读 »

今年3月份,个推将数智运营服务在消息推送场景率先落地,发布了消息推送专项运营提升方案。目前,该方案已经在游戏社交、影音资讯等行业应用,在提升消息到达率和点击率等方面表现出显著效果。尤其是TT语音,通过个推消息推送专项运营提升方案,不仅保障了消息的稳定下发,还通过文案圈人模型,高效挖掘目标用户群,使整体消息推送点击率提升了近120%。那么,个推消息推送服务到底如何帮助APP提升消息推送点击率呢?

秘诀一:智选时机,全面提升消息到达率
个推消息推送实现了智选时机,帮助APP在合适的时机下发消息。APP可以使用个推消息推送服务,实时查询设备当前在线状态,对用户属性、设备使用场景等维度综合分析,预测出最佳的用户触达时机。


同时,个推对接了APNs、华为、荣耀、小米、OPPO、vivo、 魅族、坚果、索尼、海信、FCM等十大厂商通道,提供智能配额、离线补发、推送后效分析等能力,有效保障消息的成功下发,助力APP全面提升用户触达效果。

秘诀二:标签圈人,为TA推送专属内容
个推作为一家数据智能服务商,拥有深厚的数据能力,形成了数千种画像标签和亿级别的特征数据,帮助APP精准洞察用户基础属性、兴趣偏好、场景活动特征等,实现精细化的用户分组分群。APP可以使用行为规则、画像标签快速圈选特定人群,并一键对接给个推消息推送平台,针对性推送他们感兴趣的内容,从而吸引用户点击。

秘诀三:模型圈人,AI匹配推送文案和人群
个推还将算法建模的能力融入到消息推送服务中,提供文案圈人模型,让AI学习文案特征,智能预测对该推送文案有更高点击概率的人群,从而实现把合适的内容推送给合适的人群。比如,某数千万级日活泛娱乐APP,使用个推文案圈人模型,高效挖掘目标人群,实现文案与TA用户的精准匹配,使整体消息推送点击率提升了超50%。

秘诀四:富媒体推送样式,吸引用户点击
个推提供大文本、大图、纯图片、消息重弹、角标、换底图、Emoji、消息分组等丰富的推送样式。APP可以创建更有视觉冲击力和吸引力的消息推送样式,从而吸引用户点击。

秘诀五:完整消息链路查询,持续优化推送效果
个推还提供完善的推送数据报表以及消息链路查询等服务。借助快速回流的后效数据,APP一方面可以结合A/B test分组推送等功能,对不同的人群、推送文案、推送时机进行测试对比,帮助优化推送策略;另一方面APP也可以将后效数据“喂”给AI模型继续学习,不断提升模型的预测能力。而在每一次推送和运营活动中表现出高点击、高转化的优质人群和优质文案,APP也可以将其沉淀下来,形成模板,用于下一次的推送或广告投放,持续优化推送效果。

个推消息推送专项运营提升方案围绕用户触达这一环节,将消息推送、数据分析、算法模型等能力以及自身积累的丰富运营经验整合,为APP开展数智化运营提供切实可行的场景入口。

收起阅读 »

微信获取手机号组件要收费咯,准备好钱包吧

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

继续阅读 »

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

收起阅读 »

解决支付宝小程序动态插件问题

插件 支付宝小程序

uniapp在开发支付宝小程序时,不可避免使用支付宝插件能力,大部分情况下插件是直接引入使用的,即静态引入,如下图所示


但是有些插件是需要动态加载的,而插件又分为页面插件、组件插件。其中页面插件基本没什么问题,直接使用my.loadPlugin加载后跳转,但是组件插件是不能直接按支付宝文档使用的,支付宝推荐使用‘元组件’component 通过is指定插件名称,但是uniapp的小程序是不支持使用component的,因为uniapp中的is只能使用字符串而且是直接用is的值作为组件名称支持平台,而支付宝端的插件格式为dynamic-plugin://xxx/xxx,是无法直接使用的。
下面是解决方法,主要依据uniapp的小程序自定义组件支持,按照文档创建mycomponents目录并创建自己的组件,这个组件需要按照支付宝小程序语法写,然后.axml中使用component加载插件,具体实现看自己业务


配置完成后,就可以直接在自己页面里面使用了


注意这里一定要用my.loadPlugin先把插件加载完再显示,不然有可能白屏
还有外面使用插件如果需要传参,是直接按照uniapp的语法来的,就是按照正常的组件一样使用
最后最好重新编译并打开项目,不然mycomponents目录可能不会生成

继续阅读 »

uniapp在开发支付宝小程序时,不可避免使用支付宝插件能力,大部分情况下插件是直接引入使用的,即静态引入,如下图所示


但是有些插件是需要动态加载的,而插件又分为页面插件、组件插件。其中页面插件基本没什么问题,直接使用my.loadPlugin加载后跳转,但是组件插件是不能直接按支付宝文档使用的,支付宝推荐使用‘元组件’component 通过is指定插件名称,但是uniapp的小程序是不支持使用component的,因为uniapp中的is只能使用字符串而且是直接用is的值作为组件名称支持平台,而支付宝端的插件格式为dynamic-plugin://xxx/xxx,是无法直接使用的。
下面是解决方法,主要依据uniapp的小程序自定义组件支持,按照文档创建mycomponents目录并创建自己的组件,这个组件需要按照支付宝小程序语法写,然后.axml中使用component加载插件,具体实现看自己业务


配置完成后,就可以直接在自己页面里面使用了


注意这里一定要用my.loadPlugin先把插件加载完再显示,不然有可能白屏
还有外面使用插件如果需要传参,是直接按照uniapp的语法来的,就是按照正常的组件一样使用
最后最好重新编译并打开项目,不然mycomponents目录可能不会生成

收起阅读 »

uniapp IOS 云打包,签名失败问题

iOS云端打包 云打包 iOS

按照 ios 安心打包证书安装 文档操作完成,还是报错签名失败。
怀疑是 AppleWWDRCA.cer 签名过期问题,这种应该怎么解决啊?

继续阅读 »

按照 ios 安心打包证书安装 文档操作完成,还是报错签名失败。
怀疑是 AppleWWDRCA.cer 签名过期问题,这种应该怎么解决啊?

收起阅读 »

封装第三方组件时,传递第三方组件的slot


vue3  
<script lang="ts">  
    import Exentds from '@/components/slot/Exentds.vue';  
    import { h } from 'vue'  
    export default {  
      props: {  
      },  
      setup(props,ctx) {  
        // 返回渲染函数  
        return () => h(Exentds,null,ctx.slots)  
      }  
    }  
</script>  
vue2  
<script>  
  import Exentds from '@/components/Exentds/index';  
  export default {  
    name:"exentds-slot",  
    props:["num","max"],  
    functional: true,  
  // 无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。一个函数式组件  
    render(h,ctx){  
      console.log(ctx.data)  
      return h(Exentds,ctx.data,ctx.children)或return h(Exentds,ctx.data,ctx.slots().default,ctx.slots().main)  
    }  

  }  
</script>  
slot的嵌套  
vue2/3  
<template>  
    <Exentds>  
        <template v-slot:default>  
            <slot></slot>  
        </template>  
        <template v-slot:main>  
            <slot  name="main"></slot>  
        </template>  
    </Exentds>  
</template>  

<script setup lang="ts">  
    import Exentds from '@/components/slot/Exentds.vue';  
</script>  
extend继承  
vue2/3  
<script lang="ts">  
    import Exentds from '@/components/slot/Exentds.vue';  
    // import { h } from 'vue'  
    export default {  
      props: {  

      },  
      extends:Exentds  
    }  
</script>  
注意:封装第三方组件时,除了第三方组件外,还需添加其他元素或组件  
如:  
    <div>  
      <p>1</p>  
      <testTag></testTag>  
    </div>  
    <p>2</p>  
那就不能使用extend继承的方式。 ``` 
继续阅读 »

vue3  
<script lang="ts">  
    import Exentds from '@/components/slot/Exentds.vue';  
    import { h } from 'vue'  
    export default {  
      props: {  
      },  
      setup(props,ctx) {  
        // 返回渲染函数  
        return () => h(Exentds,null,ctx.slots)  
      }  
    }  
</script>  
vue2  
<script>  
  import Exentds from '@/components/Exentds/index';  
  export default {  
    name:"exentds-slot",  
    props:["num","max"],  
    functional: true,  
  // 无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。一个函数式组件  
    render(h,ctx){  
      console.log(ctx.data)  
      return h(Exentds,ctx.data,ctx.children)或return h(Exentds,ctx.data,ctx.slots().default,ctx.slots().main)  
    }  

  }  
</script>  
slot的嵌套  
vue2/3  
<template>  
    <Exentds>  
        <template v-slot:default>  
            <slot></slot>  
        </template>  
        <template v-slot:main>  
            <slot  name="main"></slot>  
        </template>  
    </Exentds>  
</template>  

<script setup lang="ts">  
    import Exentds from '@/components/slot/Exentds.vue';  
</script>  
extend继承  
vue2/3  
<script lang="ts">  
    import Exentds from '@/components/slot/Exentds.vue';  
    // import { h } from 'vue'  
    export default {  
      props: {  

      },  
      extends:Exentds  
    }  
</script>  
注意:封装第三方组件时,除了第三方组件外,还需添加其他元素或组件  
如:  
    <div>  
      <p>1</p>  
      <testTag></testTag>  
    </div>  
    <p>2</p>  
那就不能使用extend继承的方式。 ``` 
收起阅读 »

纯nvue模式下App.vue方法调用

nvue

随着nvue组件越来越多,开始将项目从uniapp模式移植到纯nvue模式,发现在纯nvue模式下App.vue methods中的方法在未初始化完成时无法在onLaunch进行调用。
只需使用setTimeout包住,即可在onLaunch中直接调用methods中的方法。

setTimeout(() => {  
this.checkRuntimeEnv()  
}, 0)
继续阅读 »

随着nvue组件越来越多,开始将项目从uniapp模式移植到纯nvue模式,发现在纯nvue模式下App.vue methods中的方法在未初始化完成时无法在onLaunch进行调用。
只需使用setTimeout包住,即可在onLaunch中直接调用methods中的方法。

setTimeout(() => {  
this.checkRuntimeEnv()  
}, 0)
收起阅读 »

uniapp H5保存base64图片方法

                         savePicture(base64) {  

            // var arr = base64.split(','); //可以这样去掉data:image/png;base64,只拿,号后面部分  
            var bytes = atob(base64)  
            let ab = new ArrayBuffer(bytes.length);  
            console.log(ab)  
            let ia = new Uint8Array(ab);  
            for (let i = 0; i < bytes.length; i++) {  
                ia[i] = bytes.charCodeAt(i);  
            }  
            var blob = new Blob([ab], { type: 'application/octet-stream' });  
            var url = URL.createObjectURL(blob);  
            var a = document.createElement('a');  
            a.href = url;  
            a.download = new Date().valueOf() + ".jpg";  
            var e = document.createEvent('MouseEvents');  
            e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);  
            a.dispatchEvent(e);  
            URL.revokeObjectURL(url);  
        },
继续阅读 »
                         savePicture(base64) {  

            // var arr = base64.split(','); //可以这样去掉data:image/png;base64,只拿,号后面部分  
            var bytes = atob(base64)  
            let ab = new ArrayBuffer(bytes.length);  
            console.log(ab)  
            let ia = new Uint8Array(ab);  
            for (let i = 0; i < bytes.length; i++) {  
                ia[i] = bytes.charCodeAt(i);  
            }  
            var blob = new Blob([ab], { type: 'application/octet-stream' });  
            var url = URL.createObjectURL(blob);  
            var a = document.createElement('a');  
            a.href = url;  
            a.download = new Date().valueOf() + ".jpg";  
            var e = document.createEvent('MouseEvents');  
            e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);  
            a.dispatchEvent(e);  
            URL.revokeObjectURL(url);  
        },
收起阅读 »

开源一个uniapp、hyperf MineAdmin 实现的chatGPT应用,支持小程序、H5、App!

OpenAI uniapp 教程

起因:
前段时间找了一下 github 上的项目,有一些,但有的只开源了前端或只开源前端、管理端 ui ,索性自己写一个自用!

体验
注册账号密码随便填,邀请人填1

效果图
App



后台系统

技术栈 具体依赖看项目代码吧!
前端

uniapp vue3 pug scss  

后端

swoole hyperf MineAdmin

仓库地址
github

继续阅读 »

起因:
前段时间找了一下 github 上的项目,有一些,但有的只开源了前端或只开源前端、管理端 ui ,索性自己写一个自用!

体验
注册账号密码随便填,邀请人填1

效果图
App



后台系统

技术栈 具体依赖看项目代码吧!
前端

uniapp vue3 pug scss  

后端

swoole hyperf MineAdmin

仓库地址
github

收起阅读 »

个人从0到1 uni-app开发微信小程序项目——《MJ AI传送门》

uniapp 微信小程序

调用的接口是市面上最流行的AI模型之一[Midjourney]提供。

优势是'免费'。

B站也有博主用这个AI模型制作表情包,这美术效率杠杠滴。

用的开发引擎是uni-app,看中的就是它的跨平台能力,另外市场上的js插件都挺好用的,避免重复造轮子,而且用起来挺方便。

都说AI是风口,抱着试一试的态度制作了这款工具,看看我这头猪是否可以起飞。[牛]

有兴趣的可以搜索微信小程序体验下,有作图的需求的小伙伴也可以联系我哦。技术交流也可以。[佛系]

附上了几张界面图和成品图↓↓

继续阅读 »

调用的接口是市面上最流行的AI模型之一[Midjourney]提供。

优势是'免费'。

B站也有博主用这个AI模型制作表情包,这美术效率杠杠滴。

用的开发引擎是uni-app,看中的就是它的跨平台能力,另外市场上的js插件都挺好用的,避免重复造轮子,而且用起来挺方便。

都说AI是风口,抱着试一试的态度制作了这款工具,看看我这头猪是否可以起飞。[牛]

有兴趣的可以搜索微信小程序体验下,有作图的需求的小伙伴也可以联系我哦。技术交流也可以。[佛系]

附上了几张界面图和成品图↓↓

收起阅读 »

云打包iOS时,报错没有苹果根证书,解决方案

1、打开根证书目录安装3个证书,安装的时候需要注意,选择左侧登录,然后把证书拖入证书列表

证书应该只需要安装DeveloperIDCA.cer、AppleWWDRCAG3.cer就行,AppleWWDRCA.cer证书有效期到2023.02.08,已过期

2、所需根证书安装后,用原来.p12证书打包一样会报该错。这时就需要删除原来证书iPhone Distribution:xxx和iPhone Development:xxx,重新安装证书,重新生成p12文件,用新的p12证书打包,一般应该就可以解决问题了。

继续阅读 »

1、打开根证书目录安装3个证书,安装的时候需要注意,选择左侧登录,然后把证书拖入证书列表

证书应该只需要安装DeveloperIDCA.cer、AppleWWDRCAG3.cer就行,AppleWWDRCA.cer证书有效期到2023.02.08,已过期

2、所需根证书安装后,用原来.p12证书打包一样会报该错。这时就需要删除原来证书iPhone Distribution:xxx和iPhone Development:xxx,重新安装证书,重新生成p12文件,用新的p12证书打包,一般应该就可以解决问题了。

收起阅读 »

uni-app使用 uni_modules 插件模块化规简单范示例详细演示

首先需要在项目的根目录下创建一个 uni_modules 文件夹,用于存放字典文件和插件模块。

在 uni_modules 文件夹下创建一个名为 $manifest.json 的字典文件,定义插件模块的名称、版本和入口文件等信息,比如:

{  
  "name": "my-plugin",  
  "version": "1.0.0",  
  "main": "index.js"  
}  

在 uni_modules 文件夹下创建一个名为 my-plugin 的目录,用于存放插件模块的源代码。

在 my-plugin 目录下创建一个名为 index.js 的入口文件,定义插件模块的行为,比如:

export function helloWorld() {  
  console.log('Hello, World!');  
}  

现在可以在应用中引用插件模块了,比如:

<template>  
  <view>  
    <button @click="clickHandler">Click Me</button>  
  </view>  
</template>  

<script>  
import { helloWorld } from '@/uni_modules/my-plugin/index.js';  

export default {  
  methods: {  
    clickHandler() {  
      helloWorld();  
    }  
  }  
}  
</script>  

这样就完成了 uni_modules 的使用。需要注意的是,这里的引用路径使用了 @ 符号,表示项目根目录,这是 uni-app 的默认路径别名。
插件模块也可以使用同样的路径别名来引用应用程序中的代码。

继续阅读 »

首先需要在项目的根目录下创建一个 uni_modules 文件夹,用于存放字典文件和插件模块。

在 uni_modules 文件夹下创建一个名为 $manifest.json 的字典文件,定义插件模块的名称、版本和入口文件等信息,比如:

{  
  "name": "my-plugin",  
  "version": "1.0.0",  
  "main": "index.js"  
}  

在 uni_modules 文件夹下创建一个名为 my-plugin 的目录,用于存放插件模块的源代码。

在 my-plugin 目录下创建一个名为 index.js 的入口文件,定义插件模块的行为,比如:

export function helloWorld() {  
  console.log('Hello, World!');  
}  

现在可以在应用中引用插件模块了,比如:

<template>  
  <view>  
    <button @click="clickHandler">Click Me</button>  
  </view>  
</template>  

<script>  
import { helloWorld } from '@/uni_modules/my-plugin/index.js';  

export default {  
  methods: {  
    clickHandler() {  
      helloWorld();  
    }  
  }  
}  
</script>  

这样就完成了 uni_modules 的使用。需要注意的是,这里的引用路径使用了 @ 符号,表示项目根目录,这是 uni-app 的默认路径别名。
插件模块也可以使用同样的路径别名来引用应用程序中的代码。

收起阅读 »