HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

anyRTC实时消息SDK插件,支持Android、iOS

IM webrtc Android iOS uni_app

anyRTC 实时消息SDK

anyRTC实时消息 包含点对点消息、频道消息、呼叫邀请等功能,适用于在线教育、直播、社交等场景。 本插件提供实时消息能力,支持Android、iOS。

GitHub下载地址:https://github.com/anyRTC/uni-app-rtm

运行效果

原生插件通用使用流程

1、购买插件,选择该插件绑定的项目。
2、在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
3、根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
4、打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
5、开发完毕后正式云打包

付费原生插件目前不支持离线打包。

Android 离线打包原生插件另见文档: Android

iOS 离线打包原生插件另见文档: iOS

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择

继续阅读 »

anyRTC 实时消息SDK

anyRTC实时消息 包含点对点消息、频道消息、呼叫邀请等功能,适用于在线教育、直播、社交等场景。 本插件提供实时消息能力,支持Android、iOS。

GitHub下载地址:https://github.com/anyRTC/uni-app-rtm

运行效果

原生插件通用使用流程

1、购买插件,选择该插件绑定的项目。
2、在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
3、根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
4、打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
5、开发完毕后正式云打包

付费原生插件目前不支持离线打包。

Android 离线打包原生插件另见文档: Android

iOS 离线打包原生插件另见文档: iOS

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择

收起阅读 »

支付宝资金预授权开通使用流程说明与案例讲解

支付宝 支付宝小程序

一、准入门槛

①该能力仅对企业支付宝账户开放(以在线签约的结果为准)。  

②需提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致。

③提供小程序名称或产品说明文档,开发者与支付宝账户名称不一致需提供开发合作协议。

注:如果你的资质条件不满足,那就不要尝试操作申请开通了。如果资质满足,无法开通的,可以找公众号(网创商盟)进行解决。

二、流程说明

用户线上提交订单,触发商户的预授权功能,并打开授权确认界面,用户仅需在支付宝收银台中输入支付密码,确认授权后,即可完成授权。业务流程如下图所示

以充电桩场景下的资金预授权为例:

①用户搜索访问小程序或扫码访问小程序以后,点击充电桩首页 立即充电;

②商户后台生成订单,并且在小程序里自动跳转至支付宝资金预授权界面;

③用户在支付宝收银台中输入支付密码,确认授权;

④支付宝将信用授权结果同步返回给商户;

⑤消费完成后实际结算时,商家根据实际消费情况直接从授权资金中发起授权转支付,用户无需参与,仅在实际扣款成功后收到推送通知。

三、资金处理说明

①预授权冻结授权金额根据场景需求,设置合理值;

②如果用户享受信用授权,不会冻结用户资金;如果用户享受资金预授权,则冻结授权金额数;

③预授权转支付时,传入实际支付金额,支付金额不大于授权金额;用户无需参与,扣款成功后会收到通知;

④若未发起授权转支付,用户资金预授权超过 12 个月(默认,具体根据协议确定),支付宝将自动解除冻结用户授权资金;

⑤若授权转支付成功后,须商户发起解冻剩余金额(授权金额-支付金额)或者由支付宝解除,详情参考 资金冻结转支付 章节;

⑥若存在 0 租金订单,可调用解冻接口实现 0 租金订单,具体查看 解冻接口 说明;

⑦若授权转支付失败,商户可在 15 天内发起重试扣款,扣款时请保持交易订单号不变;

⑧若 15 天内尝试扣款失败,请调用支付宝 订单信息同步接口,反馈用户违约状态,芝麻届时会记录用户负面记录。

继续阅读 »

一、准入门槛

①该能力仅对企业支付宝账户开放(以在线签约的结果为准)。  

②需提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致。

③提供小程序名称或产品说明文档,开发者与支付宝账户名称不一致需提供开发合作协议。

注:如果你的资质条件不满足,那就不要尝试操作申请开通了。如果资质满足,无法开通的,可以找公众号(网创商盟)进行解决。

二、流程说明

用户线上提交订单,触发商户的预授权功能,并打开授权确认界面,用户仅需在支付宝收银台中输入支付密码,确认授权后,即可完成授权。业务流程如下图所示

以充电桩场景下的资金预授权为例:

①用户搜索访问小程序或扫码访问小程序以后,点击充电桩首页 立即充电;

②商户后台生成订单,并且在小程序里自动跳转至支付宝资金预授权界面;

③用户在支付宝收银台中输入支付密码,确认授权;

④支付宝将信用授权结果同步返回给商户;

⑤消费完成后实际结算时,商家根据实际消费情况直接从授权资金中发起授权转支付,用户无需参与,仅在实际扣款成功后收到推送通知。

三、资金处理说明

①预授权冻结授权金额根据场景需求,设置合理值;

②如果用户享受信用授权,不会冻结用户资金;如果用户享受资金预授权,则冻结授权金额数;

③预授权转支付时,传入实际支付金额,支付金额不大于授权金额;用户无需参与,扣款成功后会收到通知;

④若未发起授权转支付,用户资金预授权超过 12 个月(默认,具体根据协议确定),支付宝将自动解除冻结用户授权资金;

⑤若授权转支付成功后,须商户发起解冻剩余金额(授权金额-支付金额)或者由支付宝解除,详情参考 资金冻结转支付 章节;

⑥若存在 0 租金订单,可调用解冻接口实现 0 租金订单,具体查看 解冻接口 说明;

⑦若授权转支付失败,商户可在 15 天内发起重试扣款,扣款时请保持交易订单号不变;

⑧若 15 天内尝试扣款失败,请调用支付宝 订单信息同步接口,反馈用户违约状态,芝麻届时会记录用户负面记录。

收起阅读 »

TRONexMax智能合约系统定制开发

App

TRONexMax波场合约系统定制开发【199-2463*6653】

TRONexMax波场合约系统定制开发【199-2463*6653】

uniapp 隐私与政策提示框配置方法

app-plus下面配置

"privacy" : {
"prompt" : "template",
"template" : {
//prompt取值为template时有效,用于配置模板提示框上显示的内容
"title" : "温馨提示",
"message" : "  欢迎使用布尔App,布尔非常牛逼带你装逼带你飞。在使用App服务前,请认真阅读<a href='http或者https链接'>《用户服务协议》</a>及<a href='http或者https链接'>《隐私政策》</a>,全部条款。你同意并接受全部条款后开始使用我们的服务<br/>",
"buttonAccept" : "同意并继续", //继续下一步,进入首页
"buttonRefuse" : "不同意" //退出下载
}
},

继续阅读 »

app-plus下面配置

"privacy" : {
"prompt" : "template",
"template" : {
//prompt取值为template时有效,用于配置模板提示框上显示的内容
"title" : "温馨提示",
"message" : "  欢迎使用布尔App,布尔非常牛逼带你装逼带你飞。在使用App服务前,请认真阅读<a href='http或者https链接'>《用户服务协议》</a>及<a href='http或者https链接'>《隐私政策》</a>,全部条款。你同意并接受全部条款后开始使用我们的服务<br/>",
"buttonAccept" : "同意并继续", //继续下一步,进入首页
"buttonRefuse" : "不同意" //退出下载
}
},

收起阅读 »

H5跨域秒解决的方法

uniCloud

一、在uniCloud前端网页托管===>参数配置中,复制你的网站网址(默认域名)。
二、在跨域配置===>新增域名内,粘贴确定即可。
三、所有端都可以通过网址(默认域名)访问你的网站了。

继续阅读 »

一、在uniCloud前端网页托管===>参数配置中,复制你的网站网址(默认域名)。
二、在跨域配置===>新增域名内,粘贴确定即可。
三、所有端都可以通过网址(默认域名)访问你的网站了。

收起阅读 »

微信支付商户号H5支付产品权限开通详解

微信h5 微信app

一、微信商户H5支付产品简介

H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。

主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付

二、H5支付开通流程详解

登录商户平台-->产品中心-->我的产品-->支付产品-->H5支付

需要如实完善以下信息后再进行申请提交

◆ 需要搭建一个H5商城系统,要有完整的购买支付流程展示。

◆ 如有同主体备案域名,可以直接提交提交进行申请。

◆ 如无同主体域名,需要用到《ICP备案授权函》,模板可在“网创商盟”中下载。记得在授权函中填写所需的完整信息,并且签字盖章

◆ 如实填写售卖产品信息

如果上述操作,有问题或者想要进一步信息了解,可以前往“网创商盟”这个公众号获取更多帮助支持。同时祝愿大家早日开通H5支付来运营使用。

继续阅读 »

一、微信商户H5支付产品简介

H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。

主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付

二、H5支付开通流程详解

登录商户平台-->产品中心-->我的产品-->支付产品-->H5支付

需要如实完善以下信息后再进行申请提交

◆ 需要搭建一个H5商城系统,要有完整的购买支付流程展示。

◆ 如有同主体备案域名,可以直接提交提交进行申请。

◆ 如无同主体域名,需要用到《ICP备案授权函》,模板可在“网创商盟”中下载。记得在授权函中填写所需的完整信息,并且签字盖章

◆ 如实填写售卖产品信息

如果上述操作,有问题或者想要进一步信息了解,可以前往“网创商盟”这个公众号获取更多帮助支持。同时祝愿大家早日开通H5支付来运营使用。

收起阅读 »

无需苹果电脑上传ipa到AppStore构造版本,liunx下上传ipa到App Store,windows上传ipa

内测 上架

前言:

> 虽然Mac系统使用xcode自带的上传ipa工具很方便,也很简单,但众多跨平台开发者,如:uni-app,apicloud,Flutter等混合开发者,用不到mac系统来开发,几乎没有必要用到,如果只是一个上传ipa功能,来买个Mac,那太不划算了(土豪随意),我们开发出了无需Mac,自助上传ipa文件到Appstore构造版本,无需Mac系统,无需苹果电脑,无需安装任何程序,只需要一个浏览器即可搞定,兼容多种环境,服务器千兆宽带上传,直连苹果端,上传IP随机更换,提升App Store上架成功率,4.3被拒几率也会大大降低。我们将会当您的iPA上传成功后,立刻删除您的账号密码,确保数据安全,始终坚持用最好的服务,为客户带来最大的价值,欢迎您的使用!

续:

> 古人云:读书破万卷,下笔如有神...........咳咳,废话不多说

>
> 1.上传ipa
> 2.输入开发者账号,和专用密码
> 3.提交任务

后记:

> 1.我们解决了混合开发者彻底摆脱Mac系统

> 2.解决了在Mac系统下上传IPA卡住的问题(正在通过App Store进行认证或正在验证 App一直没动静)

> 3.千兆宽带支持,上传速度更快,代替mac的application loader, 上传构建文件到开发者中心

> 4.专用密码详解:专用密码不是开发者的账号密码,需要在开发者中心右上角账号名里点"Email Settings"->再点"My Apple ID",登录apple Id的安全管理页面里获取专用密码,这里的专用密码,仅适用于上传ipa构造版本,无法登陆其他网站或者第三方应用!

> 简单三步搞定;地址:https://www.chuxueyun.com/ipaup/index.html

继续阅读 »

前言:

> 虽然Mac系统使用xcode自带的上传ipa工具很方便,也很简单,但众多跨平台开发者,如:uni-app,apicloud,Flutter等混合开发者,用不到mac系统来开发,几乎没有必要用到,如果只是一个上传ipa功能,来买个Mac,那太不划算了(土豪随意),我们开发出了无需Mac,自助上传ipa文件到Appstore构造版本,无需Mac系统,无需苹果电脑,无需安装任何程序,只需要一个浏览器即可搞定,兼容多种环境,服务器千兆宽带上传,直连苹果端,上传IP随机更换,提升App Store上架成功率,4.3被拒几率也会大大降低。我们将会当您的iPA上传成功后,立刻删除您的账号密码,确保数据安全,始终坚持用最好的服务,为客户带来最大的价值,欢迎您的使用!

续:

> 古人云:读书破万卷,下笔如有神...........咳咳,废话不多说

>
> 1.上传ipa
> 2.输入开发者账号,和专用密码
> 3.提交任务

后记:

> 1.我们解决了混合开发者彻底摆脱Mac系统

> 2.解决了在Mac系统下上传IPA卡住的问题(正在通过App Store进行认证或正在验证 App一直没动静)

> 3.千兆宽带支持,上传速度更快,代替mac的application loader, 上传构建文件到开发者中心

> 4.专用密码详解:专用密码不是开发者的账号密码,需要在开发者中心右上角账号名里点"Email Settings"->再点"My Apple ID",登录apple Id的安全管理页面里获取专用密码,这里的专用密码,仅适用于上传ipa构造版本,无法登陆其他网站或者第三方应用!

> 简单三步搞定;地址:https://www.chuxueyun.com/ipaup/index.html

收起阅读 »

原生编辑视频传给前端本地地址,上传oss


//v  = 原生本地视频路径  
fileInfo(v){  
           var file = typeof(v) === 'object' ? v : JSON.parse(v)  
           var reader = new plus.io.FileReader();  
           reader.onloadstart = function(e) {  
               // console.log('resolveLocalFileSystemURL onloadstart reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onloadstart:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onload = function(e) {  
               // console.log('resolveLocalFileSystemURL onload reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onload:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onabort = function(e) {  
               // console.log('resolveLocalFileSystemURL onabort reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onabort:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onerror = function(e) {  
               // console.log('resolveLocalFileSystemURL onerror reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onerror:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onloadend = function ( e ) {    
               console.log("resolveLocalFileSystemURL onloadend  e.target.result:" + e.target.result.substring(0,180));  
               // var blob = base64toBlob(reader.result, "UTF-8");  
               // console.log('resolveLocalFileSystemURL   blob :' , vueSelf.$center.dataURItoBlob(e.target.result))  
               try{  
                   var blob = dataURLtoBlob(e.target.result)  
                   console.log("resolveLocalFileSystemURL onloadend  blob :" + blob.substring(0,180));  
                   //BLOB对象转换为FILE对象     
                   var newfile = new File([blob],file.name);    
                   console.log("resolveLocalFileSystemURL  start" );    
                   console.log(newfile.size+'---'+newfile.name);    
                   console.log(entry.toLocalURL());    
                   console.log("resolveLocalFileSystemURL  end" );    
               }catch(e){  
                   //TODO handle the exception  
                   console.log('resolveLocalFileSystemURL cash' ,e)  
               }  
               // vueSelf.$center.fileUpload('mp4',blob)  
           }  
            reader.readAsDataURL(file, 'utf-8');    
           // reader.readAsText(file, 'utf-8');  
           //Base64转二进制  
           function  dataURLtoBlob(dataurl) {    
               var arr = dataurl.split(','),    
                   mime = arr[0].match(/:(.*?);/)[1],    
                   bstr = atob(arr[1]),    
                   n = bstr.length,    
                   u8arr = new Uint8Array(n);//8位无符号整数,长度1个字节    
               console.log(mime)    
               while (n--) {    
                   u8arr[n] = bstr.charCodeAt(n);    
               }    
               // console.log(JSON.stringify(u8arr));    
               return new Blob([u8arr], {    
                   type: mime    
               });    
           }  
        },
继续阅读 »

//v  = 原生本地视频路径  
fileInfo(v){  
           var file = typeof(v) === 'object' ? v : JSON.parse(v)  
           var reader = new plus.io.FileReader();  
           reader.onloadstart = function(e) {  
               // console.log('resolveLocalFileSystemURL onloadstart reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onloadstart:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onload = function(e) {  
               // console.log('resolveLocalFileSystemURL onload reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onload:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onabort = function(e) {  
               // console.log('resolveLocalFileSystemURL onabort reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onabort:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onerror = function(e) {  
               // console.log('resolveLocalFileSystemURL onerror reader.result' + reader.result);  
               console.log("resolveLocalFileSystemURL onerror:" + JSON.stringify(e).substring(0,180));  
           }  
           reader.onloadend = function ( e ) {    
               console.log("resolveLocalFileSystemURL onloadend  e.target.result:" + e.target.result.substring(0,180));  
               // var blob = base64toBlob(reader.result, "UTF-8");  
               // console.log('resolveLocalFileSystemURL   blob :' , vueSelf.$center.dataURItoBlob(e.target.result))  
               try{  
                   var blob = dataURLtoBlob(e.target.result)  
                   console.log("resolveLocalFileSystemURL onloadend  blob :" + blob.substring(0,180));  
                   //BLOB对象转换为FILE对象     
                   var newfile = new File([blob],file.name);    
                   console.log("resolveLocalFileSystemURL  start" );    
                   console.log(newfile.size+'---'+newfile.name);    
                   console.log(entry.toLocalURL());    
                   console.log("resolveLocalFileSystemURL  end" );    
               }catch(e){  
                   //TODO handle the exception  
                   console.log('resolveLocalFileSystemURL cash' ,e)  
               }  
               // vueSelf.$center.fileUpload('mp4',blob)  
           }  
            reader.readAsDataURL(file, 'utf-8');    
           // reader.readAsText(file, 'utf-8');  
           //Base64转二进制  
           function  dataURLtoBlob(dataurl) {    
               var arr = dataurl.split(','),    
                   mime = arr[0].match(/:(.*?);/)[1],    
                   bstr = atob(arr[1]),    
                   n = bstr.length,    
                   u8arr = new Uint8Array(n);//8位无符号整数,长度1个字节    
               console.log(mime)    
               while (n--) {    
                   u8arr[n] = bstr.charCodeAt(n);    
               }    
               // console.log(JSON.stringify(u8arr));    
               return new Blob([u8arr], {    
                   type: mime    
               });    
           }  
        },
收起阅读 »

强烈建议 Dcloud 放弃 hbuilderX

HBuilderX uniapp

不知道 Dcloud 准备往哪个方向发展!
但无论什么方向,暂时放弃hbuilderX都是最佳的选择!!!
集中精力提高编译、调试体验是开发者最关心的。
我希望有这么一个工具:

无论我用什么开发工具:webstor?sublime?都可以
只要项目基于 cli 创建,就可以使用我进行编译或打包:
调试时,能有原生开发级别的效率,如调试信息的输出方面。
APP 级别的、webview 级别的消息如果能集成在一个地方查看那就更好了
各种异常都能给出提示,让用户不再无头苍蝇一般。

如果能集成发布工具那就更好了,一键上架 N个市场,辅助申请各种证书。

而不是正事不干,去开发一个四流的开发工具 IDE。

继续阅读 »

不知道 Dcloud 准备往哪个方向发展!
但无论什么方向,暂时放弃hbuilderX都是最佳的选择!!!
集中精力提高编译、调试体验是开发者最关心的。
我希望有这么一个工具:

无论我用什么开发工具:webstor?sublime?都可以
只要项目基于 cli 创建,就可以使用我进行编译或打包:
调试时,能有原生开发级别的效率,如调试信息的输出方面。
APP 级别的、webview 级别的消息如果能集成在一个地方查看那就更好了
各种异常都能给出提示,让用户不再无头苍蝇一般。

如果能集成发布工具那就更好了,一键上架 N个市场,辅助申请各种证书。

而不是正事不干,去开发一个四流的开发工具 IDE。

收起阅读 »

plus.statistic.eventTrig触发友盟统计事件,友盟后台无反应--解决

统计
                        //对于一些没有eventValue的事件 如果eventValue为空 或空对象  友盟后台会统计不到这个事件  
            //所以这里加空判断 如果为空 设置一个默认值  

            if(isEmptyObj(event.eventValue)){  
                plus.statistic.eventTrig(event.eventId,{"name":'default'});  
            }else{  
                plus.statistic.eventTrig(event.eventId, event.eventValue);  
            }

找了好久终于发现这个问题,触发事件时记得判断传入的值是否是空 或 空对象

继续阅读 »
                        //对于一些没有eventValue的事件 如果eventValue为空 或空对象  友盟后台会统计不到这个事件  
            //所以这里加空判断 如果为空 设置一个默认值  

            if(isEmptyObj(event.eventValue)){  
                plus.statistic.eventTrig(event.eventId,{"name":'default'});  
            }else{  
                plus.statistic.eventTrig(event.eventId, event.eventValue);  
            }

找了好久终于发现这个问题,触发事件时记得判断传入的值是否是空 或 空对象

收起阅读 »

uniapp打包时的问题

uniapp离线打包

现在的uniapp云打包是真的差劲,一个10mb左右的包给我打包了半个小时,忍不住吐槽

现在的uniapp云打包是真的差劲,一个10mb左右的包给我打包了半个小时,忍不住吐槽

App 下载视频到本地相册

const downloadTask = uni.downloadFile({  
                        url: url,  // 视频的下载地址  
                        success: (data) => {  
                            if (data.statusCode === 200) {  
                                 uni.saveImageToPhotosAlbum({ // 需要保存到相册 如果是下载文件 用uni.saveFile()  
                                      filePath: data.tempFilePath, // 视频的本地临时地址  
                                      success: function (res) {  
                                          console.log('下载成功')  
                                        uni.showToast({  
                                            title: '下载完成,请到相册查看',  
                                            position: 'center',  
                                            icon: 'none',  
                                            duration: 2000  
                                        });  
                                      },  
                                      fail: () => {  
                                        uni.showToast({  
                                            title: '下载视频失败请重试',  
                                            position: 'center',  
                                            icon: 'none',  
                                            duration: 2000  
                                        });  
                                      }  
                                    });  
                            }  
                        },  
                        fail: (err)=>{  
                            this.downText = '下载视频'  
                            uni.hideLoading()  
                            uni.showToast({  
                                title: err,  
                                position: 'center',  
                                icon: 'none',  
                                duration: 2000  
                            });  
                        },  
                        complete: ()=>{  
                            this.downText ='下载视频'  
                        }  
                    });  

                    downloadTask.onProgressUpdate((res) => { // 下载进度  
                        this.downText = `已下载${res.progress}%`  
                        if(res.progress == 100){  
                            this.downText = '下载视频'  

                        }  
                    });
继续阅读 »
const downloadTask = uni.downloadFile({  
                        url: url,  // 视频的下载地址  
                        success: (data) => {  
                            if (data.statusCode === 200) {  
                                 uni.saveImageToPhotosAlbum({ // 需要保存到相册 如果是下载文件 用uni.saveFile()  
                                      filePath: data.tempFilePath, // 视频的本地临时地址  
                                      success: function (res) {  
                                          console.log('下载成功')  
                                        uni.showToast({  
                                            title: '下载完成,请到相册查看',  
                                            position: 'center',  
                                            icon: 'none',  
                                            duration: 2000  
                                        });  
                                      },  
                                      fail: () => {  
                                        uni.showToast({  
                                            title: '下载视频失败请重试',  
                                            position: 'center',  
                                            icon: 'none',  
                                            duration: 2000  
                                        });  
                                      }  
                                    });  
                            }  
                        },  
                        fail: (err)=>{  
                            this.downText = '下载视频'  
                            uni.hideLoading()  
                            uni.showToast({  
                                title: err,  
                                position: 'center',  
                                icon: 'none',  
                                duration: 2000  
                            });  
                        },  
                        complete: ()=>{  
                            this.downText ='下载视频'  
                        }  
                    });  

                    downloadTask.onProgressUpdate((res) => { // 下载进度  
                        this.downText = `已下载${res.progress}%`  
                        if(res.progress == 100){  
                            this.downText = '下载视频'  

                        }  
                    });
收起阅读 »