uniapp前端图片和视频直传华为云OBS记录
uniapp 官方合作的云存储是阿里云和腾讯云,但我们公司选的云存储服务恰好都不是这两家,是华为云 OBS。网上搜了多次,没有能成功的案例分享。但是,考虑到网上关于华为云性能优异的测评报告,以及我对华为这家公司的好感,我还是想努力把这条路走通。因此,走上了坚苦的踩坑之路。
但大家不必重复这个踩坑经历了,我直接上拿走即用的代码。
技术路线确定:
- 前端产生签名前端直传华为云OBS:好处是不经过自家服务器周转,减少一个环节,上传速度更快。坏处:前端产生签名的过程中,会将 AK,SK 等核心账号信息暴露,是极其危险的。
- 后端签名前端获取后直传华为云OBS:好处同上,而且由于是后端生成签名,前端获取有时效性的签名后直传云端,因此没有泄露核心账号信息的风险。
我选择第二条路线。以下是上传视频文件的步骤(图片上传相似,多文件在上传前增加一个循环而已。下面不只是前端代码,也包括必要的后端代码):
1.后端生成上传文件到OBS 的签名(PHP)的代码:
在做这一步之前,让后台技术同事先在服务器目录下安装 OBS的 PHP SKD,这一步有详细文档,此处忽略。
$object = $this->input->post('file_name')?:''; //文件名
$file_type = $this->input->post('file_type')?: ''; //文件类型
$obsClient = new ObsClient ( [
'key' => '***', //OBS 中的 AK
'secret' => '***', //OBS 中的 SK
'endpoint' => 'https://obs.cn-north-4.myhuaweicloud.com', //注意实际的终点可能不同
'signature' => 'obs',
] );
// URL有效期,3600秒
$expires = 3600;
// 上传对象
$resp = $obsClient->createPostSignature( [
'Bucket' => '***', //你自己的桶名(bucket)
'Key' => $object,
'Expires' => $expires,
'FormParams' => [
'x-obs-acl' => 'public-read',
'content-type' => $file_type,
]
] );
// printf($resp);
$data['Accesskeyid'] = '***'; //AK
$data['Policy'] = $resp['Policy'];
$data['Signature'] = $resp['Signature'];
echo json_encode($data);
} ```
2. 前端选择视频文件,生成必要信息:
```select_video(){
var _this = this;
uni.chooseVideo({
maxDuration: 60, //拍摄视频最长拍摄时间,单位秒
count:1, //上传视频的数量
sourceType:['camera','album'],
success: (res) => {
console.log(res)
_this.video_src = res.tempFilePath;
let index1 = res.tempFilePath.lastIndexOf('/');
let index2 = res.tempFilePath.lastIndexOf('.');
_this.file_name = res.tempFilePath.substring(index1+1,res.tempFilePath.length); //获取文件名
_this.file_type = res.tempFilePath.substring(index2+1, res.tempFilePath.length); // 获取文件后缀名,即文件类型
_this.key = 'video/' + _this.file_name;
console.log(_this.file_name)
_this.is_video = 1;
},
})
}, ```
3. 前端获取上传文件的签名并直传 OBS(一步完成):
可以写在当前页面,也可以封装成公共方法,建议封装。
``` function get_obs_signature(file_path, file_name, file_type){
console.log(file_name)
return new Promise((resolve, reject)=>{
uni.request({
url: '***', //PHP获取签名的接口路径
method: 'POST',
header:{
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
file_name: file_name,
file_type: file_type
},
success: (res) => {
console.log(res.data)
resolve(res.data)
}
})
}).then(res=>{
let policy = res.Policy;
let signature = res.Signature;
let ak = res.Accesskeyid;
console.log(policy)
uni.uploadFile({
url: 'https://***.obs.cn-north-4.myhuaweicloud.com', //用你自己的 bucket 名替换星号
filePath: file_path,
name: 'file',
formData: {
'key': file_name,
'AccessKeyId': ak,
'Policy': policy,
'x-obs-acl': 'public-read',
'content-type': file_type,
'Signature': signature
},
success:(res)=>{
console.log(res);
}
})
}) ```
4. 获取上传后的文件路径:
OBS 默认不返回上传成功的路径,那该怎么办?其实很简单,存储在 OBS 的文件都有规律,通过以下方法可以拼接:
obs_url = 'https://***.obs.cn-north-4.myhuaweicloud.com/' + _this.key; //用你自己的 bucket 名替换星号 uniapp 官方合作的云存储是阿里云和腾讯云,但我们公司选的云存储服务恰好都不是这两家,是华为云 OBS。网上搜了多次,没有能成功的案例分享。但是,考虑到网上关于华为云性能优异的测评报告,以及我对华为这家公司的好感,我还是想努力把这条路走通。因此,走上了坚苦的踩坑之路。
但大家不必重复这个踩坑经历了,我直接上拿走即用的代码。
技术路线确定:
- 前端产生签名前端直传华为云OBS:好处是不经过自家服务器周转,减少一个环节,上传速度更快。坏处:前端产生签名的过程中,会将 AK,SK 等核心账号信息暴露,是极其危险的。
- 后端签名前端获取后直传华为云OBS:好处同上,而且由于是后端生成签名,前端获取有时效性的签名后直传云端,因此没有泄露核心账号信息的风险。
我选择第二条路线。以下是上传视频文件的步骤(图片上传相似,多文件在上传前增加一个循环而已。下面不只是前端代码,也包括必要的后端代码):
1.后端生成上传文件到OBS 的签名(PHP)的代码:
在做这一步之前,让后台技术同事先在服务器目录下安装 OBS的 PHP SKD,这一步有详细文档,此处忽略。
$object = $this->input->post('file_name')?:''; //文件名
$file_type = $this->input->post('file_type')?: ''; //文件类型
$obsClient = new ObsClient ( [
'key' => '***', //OBS 中的 AK
'secret' => '***', //OBS 中的 SK
'endpoint' => 'https://obs.cn-north-4.myhuaweicloud.com', //注意实际的终点可能不同
'signature' => 'obs',
] );
// URL有效期,3600秒
$expires = 3600;
// 上传对象
$resp = $obsClient->createPostSignature( [
'Bucket' => '***', //你自己的桶名(bucket)
'Key' => $object,
'Expires' => $expires,
'FormParams' => [
'x-obs-acl' => 'public-read',
'content-type' => $file_type,
]
] );
// printf($resp);
$data['Accesskeyid'] = '***'; //AK
$data['Policy'] = $resp['Policy'];
$data['Signature'] = $resp['Signature'];
echo json_encode($data);
} ```
2. 前端选择视频文件,生成必要信息:
```select_video(){
var _this = this;
uni.chooseVideo({
maxDuration: 60, //拍摄视频最长拍摄时间,单位秒
count:1, //上传视频的数量
sourceType:['camera','album'],
success: (res) => {
console.log(res)
_this.video_src = res.tempFilePath;
let index1 = res.tempFilePath.lastIndexOf('/');
let index2 = res.tempFilePath.lastIndexOf('.');
_this.file_name = res.tempFilePath.substring(index1+1,res.tempFilePath.length); //获取文件名
_this.file_type = res.tempFilePath.substring(index2+1, res.tempFilePath.length); // 获取文件后缀名,即文件类型
_this.key = 'video/' + _this.file_name;
console.log(_this.file_name)
_this.is_video = 1;
},
})
}, ```
3. 前端获取上传文件的签名并直传 OBS(一步完成):
可以写在当前页面,也可以封装成公共方法,建议封装。
``` function get_obs_signature(file_path, file_name, file_type){
console.log(file_name)
return new Promise((resolve, reject)=>{
uni.request({
url: '***', //PHP获取签名的接口路径
method: 'POST',
header:{
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
file_name: file_name,
file_type: file_type
},
success: (res) => {
console.log(res.data)
resolve(res.data)
}
})
}).then(res=>{
let policy = res.Policy;
let signature = res.Signature;
let ak = res.Accesskeyid;
console.log(policy)
uni.uploadFile({
url: 'https://***.obs.cn-north-4.myhuaweicloud.com', //用你自己的 bucket 名替换星号
filePath: file_path,
name: 'file',
formData: {
'key': file_name,
'AccessKeyId': ak,
'Policy': policy,
'x-obs-acl': 'public-read',
'content-type': file_type,
'Signature': signature
},
success:(res)=>{
console.log(res);
}
})
}) ```
4. 获取上传后的文件路径:
OBS 默认不返回上传成功的路径,那该怎么办?其实很简单,存储在 OBS 的文件都有规律,通过以下方法可以拼接:
obs_url = 'https://***.obs.cn-north-4.myhuaweicloud.com/' + _this.key; //用你自己的 bucket 名替换星号 收起阅读 »
直播类小程序,没有相关证书如何过类目,如何快速上架
本人可以帮助没有直播资质的客户快速的进行微信小程序的上架,包过类目,包过审核,包上架
本人可以帮助没有直播资质的客户快速的进行微信小程序的上架,包过类目,包过审核,包上架
cover-view里的文本不能换行-vue
cover-view里的文本不能换行可能是样式问题,在这个范围内再去找问题,一般 white-space: normal;可以解决问题,防止万一加一个!important,在cover-view就可以,但是存在换行成功,却没有文字显示,同时高度有变化却没有设置高度,这时再加上 line-height:normal!important;,让其显示出来,
原因如下:
cover-view默认属性有(好像是小程序的):
cover-view {
display:block;
line-height:1.2;
overflow:hidden;
white-space:nowrap;
pointer-events:auto;
}
注意:可以换行后,每个cover-view建议加一个高度或是单行white-space属性不为normal,如果单行没有高度或是单行white-space属性为normal,在安卓中可能不显示。
参考:https://www.jianshu.com/p/3c255f5c94f9?from=singlemessage
cover-view里的文本不能换行可能是样式问题,在这个范围内再去找问题,一般 white-space: normal;可以解决问题,防止万一加一个!important,在cover-view就可以,但是存在换行成功,却没有文字显示,同时高度有变化却没有设置高度,这时再加上 line-height:normal!important;,让其显示出来,
原因如下:
cover-view默认属性有(好像是小程序的):
cover-view {
display:block;
line-height:1.2;
overflow:hidden;
white-space:nowrap;
pointer-events:auto;
}
注意:可以换行后,每个cover-view建议加一个高度或是单行white-space属性不为normal,如果单行没有高度或是单行white-space属性为normal,在安卓中可能不显示。
参考:https://www.jianshu.com/p/3c255f5c94f9?from=singlemessage
收起阅读 »uni-app打包h5 报内存不够
mui 只许上拉加载
工作中用mui时出现一个问题,需求是只要上拉加载,但出现了下拉也加载的情况,现在有一个解决办法,如下:
添加 down : {
style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式
color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色
height:'50px',//可选,默认50px.下拉刷新控件的高度,
range:'100px', //可选 默认100px,控件可下拉拖拽的范围
offset:'0px', //可选 默认0px,下拉刷新控件的起始位置
auto: false,//可选,默认false.首次加载自动上拉刷新一次
callback :()=>{
this.disablePulldownToRefresh()
} //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
}
工作中用mui时出现一个问题,需求是只要上拉加载,但出现了下拉也加载的情况,现在有一个解决办法,如下:
添加 down : {
style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式
color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色
height:'50px',//可选,默认50px.下拉刷新控件的高度,
range:'100px', //可选 默认100px,控件可下拉拖拽的范围
offset:'0px', //可选 默认0px,下拉刷新控件的起始位置
auto: false,//可选,默认false.首次加载自动上拉刷新一次
callback :()=>{
this.disablePulldownToRefresh()
} //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
}
5+APP安卓原生插件开发全流程个人总结
1、离线打包
Hbuilder官方路径:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android
为什么要用离线打包呢,因为是开发安卓第三方插件,主要用的是Android Stuido,所以把5+APP项目导到Android studio里来,方便开发和测试。
其实还有一个原因,涉及到的第三方插件用到了系统级权限,要用platform.pk8来签名打包,才能运行。所以用离线打包会方便点。
Hbuilder(X)用不了pk8签名,当然,你可以把pk8转换成keystore文件,这样就可以签名了。
这里有大佬介绍转换,不过我还没试。(https://blog.csdn.net/langlitaojin/article/details/108045709)
2、添加第三方插件文件及支持
将第三方插件的jar包,so文件拷贝到Android studio相应的目录(app-libs)下,然后在gradle最外层配置:
repositories {
flatDir {
dirs 'libs'
}
}
在dependencies层加入:
implementation fileTree(dir: 'libs', include: ['.aar', '.jar', '*.so'], exclude: [])
注意:有so文件的话,需要在gradle的android层配置ndk支持。
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' ,'x86', 'armeabi-v7a'
}
3、创建java类封装第三方插件所要用到的功能,封装成一个个独立的方法。数据传递到js端:广播,或者用接口类回调。
这个有个地方要注意,如果注册了广播监听者,没有注销的话,应用退出再重新打开之后,会报:
IllegalArgumentException: Receiver not registered。
我用5+的方法去注销在java里注册的广播,但是没起到效果,不得其解。
然后我转而在java层封装了一个注销监听器的方法,然后在js层调用,问题就没再出现了。
所以呢,我觉得原生的方法就尽量在java层里写好,由js层调用,避免用5+来写。
这里呢,我觉得还是少用广播吧,注销是个麻烦事,在java里可以在专门的生命周期里注销,但是在js里,就麻烦了,要在各种事件(页面上的返回键或关闭键,手机上的虚拟或物理返回)上去监听做注销处理。
4、创建一个js类,用5+API来封装上面封装好的java类的方法。
用java封装完第三方库,接着就是在js也封装一个相应的api,方便前端开发人员使用,也方便维护。
注意:如果是系统级应用,那么要hook一下webview(因为webview存在安全漏洞,从安卓5.1开始,谷歌禁止系统应用使用webview)。
提示:Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
解决方法:
1、首先呢,创建一个Application继承自DCloudApplication,然后在AndroidManifest.xml里,引用自己的Application,且加上tools:replace="android:name",避免与Hbuilder的lib里的DCloudApplication冲突
2、在application的onCreate方法的super方法前,调用hook webview的方法,来绕过谷歌的禁用。
具体hook的方法:https://www.52pojie.cn/thread-992014-1-1.html
1、离线打包
Hbuilder官方路径:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android
为什么要用离线打包呢,因为是开发安卓第三方插件,主要用的是Android Stuido,所以把5+APP项目导到Android studio里来,方便开发和测试。
其实还有一个原因,涉及到的第三方插件用到了系统级权限,要用platform.pk8来签名打包,才能运行。所以用离线打包会方便点。
Hbuilder(X)用不了pk8签名,当然,你可以把pk8转换成keystore文件,这样就可以签名了。
这里有大佬介绍转换,不过我还没试。(https://blog.csdn.net/langlitaojin/article/details/108045709)
2、添加第三方插件文件及支持
将第三方插件的jar包,so文件拷贝到Android studio相应的目录(app-libs)下,然后在gradle最外层配置:
repositories {
flatDir {
dirs 'libs'
}
}
在dependencies层加入:
implementation fileTree(dir: 'libs', include: ['.aar', '.jar', '*.so'], exclude: [])
注意:有so文件的话,需要在gradle的android层配置ndk支持。
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' ,'x86', 'armeabi-v7a'
}
3、创建java类封装第三方插件所要用到的功能,封装成一个个独立的方法。数据传递到js端:广播,或者用接口类回调。
这个有个地方要注意,如果注册了广播监听者,没有注销的话,应用退出再重新打开之后,会报:
IllegalArgumentException: Receiver not registered。
我用5+的方法去注销在java里注册的广播,但是没起到效果,不得其解。
然后我转而在java层封装了一个注销监听器的方法,然后在js层调用,问题就没再出现了。
所以呢,我觉得原生的方法就尽量在java层里写好,由js层调用,避免用5+来写。
这里呢,我觉得还是少用广播吧,注销是个麻烦事,在java里可以在专门的生命周期里注销,但是在js里,就麻烦了,要在各种事件(页面上的返回键或关闭键,手机上的虚拟或物理返回)上去监听做注销处理。
4、创建一个js类,用5+API来封装上面封装好的java类的方法。
用java封装完第三方库,接着就是在js也封装一个相应的api,方便前端开发人员使用,也方便维护。
注意:如果是系统级应用,那么要hook一下webview(因为webview存在安全漏洞,从安卓5.1开始,谷歌禁止系统应用使用webview)。
提示:Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
解决方法:
1、首先呢,创建一个Application继承自DCloudApplication,然后在AndroidManifest.xml里,引用自己的Application,且加上tools:replace="android:name",避免与Hbuilder的lib里的DCloudApplication冲突
2、在application的onCreate方法的super方法前,调用hook webview的方法,来绕过谷歌的禁用。
具体hook的方法:https://www.52pojie.cn/thread-992014-1-1.html
收起阅读 »canvas组件在android手机使用CanvasContext.draw可能绘制不完整的解决办法
在android手机的app中使用canvas组件的CanvasContext.draw方法,可能导致绘制不完整,估计原因是手机计算draw之前的一系列代码没有完成,解决办法是使用以下代码延时执行CanvasContext.draw方法。实测成功。
// #ifdef APP-PLUS
if(plus.os.name == "Android"){
setTimeout(()=>{
this.context.draw(true, ()=>{
console.log('createBill success');
callback()
})
}, 100)
}else{
this.context.draw(true, ()=>{
console.log('createBill success');
callback()
})
}
// #endif
// #ifndef APP-PLUS
this.context.draw(true, ()=>{
console.log('createBill success');
callback()
})
// #endif 在android手机的app中使用canvas组件的CanvasContext.draw方法,可能导致绘制不完整,估计原因是手机计算draw之前的一系列代码没有完成,解决办法是使用以下代码延时执行CanvasContext.draw方法。实测成功。
// #ifdef APP-PLUS
if(plus.os.name == "Android"){
setTimeout(()=>{
this.context.draw(true, ()=>{
console.log('createBill success');
callback()
})
}, 100)
}else{
this.context.draw(true, ()=>{
console.log('createBill success');
callback()
})
}
// #endif
// #ifndef APP-PLUS
this.context.draw(true, ()=>{
console.log('createBill success');
callback()
})
// #endif 收起阅读 »
关于Mac版Hbuilder X文件查找失败的bug的【解决方案】
问题描述
Mac版Hbuilder X创建uni-app项目后,运行时会提示“文件查找失败,找不到xxxx/main.js”。
解决方案:
1.将新创建的项目【从项目列表移除】
2.选择【文件-打开目录】重新打开之前创建的项目
此时就可以运行成功。
另外如果提示“尚不支持此种类型文件”,在排除真的是类型原因的情况下,按以上方式操作也能解决该问题。
具体是不是bug,目前还不清楚,这个问题困扰了好久,网上也找不到答案,所以写出来,分享给有同样问题的小伙伴。
问题描述
Mac版Hbuilder X创建uni-app项目后,运行时会提示“文件查找失败,找不到xxxx/main.js”。
解决方案:
1.将新创建的项目【从项目列表移除】
2.选择【文件-打开目录】重新打开之前创建的项目
此时就可以运行成功。
另外如果提示“尚不支持此种类型文件”,在排除真的是类型原因的情况下,按以上方式操作也能解决该问题。
具体是不是bug,目前还不清楚,这个问题困扰了好久,网上也找不到答案,所以写出来,分享给有同样问题的小伙伴。
收起阅读 »iOS马甲包上架方法论
> 马甲包是利用各大市场规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致。
至于为什么做马甲包,能读这篇文章的自然也不需要我多说什么了吧,引流、抗风险、关键词覆盖、刷榜,对于一些灰色产业或者用户获取竞争激烈的行业领域来说,意义非凡。但是苹果爸爸可不允许这种情况发生,马甲包在审核环节,是非常容易被拒的,毕竟破坏苹果商店公平性的东西,是不被允许的。
当然,我们对iOS的审核机制进行了深入的研究和尝试,马甲包也是成功上架过很多了。马甲包该如何上架呢?找我就好啦~ 哈哈哈!!言归正传,下文详述。
那么马甲包该如何上架?
需要马甲包代上架的可以联系我,QQ:1481983952
马甲包被拒最常见的4.3被拒
- 3 Design: SpamGuideline 4.3 - Design
首先4.3基本是机器审,是你之前用这套源码上过一个包,现在用这套代码直接改一个logo跟名字再上一个马甲,这种基本会直接4.3
这种情况基本要改源码,First:文件夹的名字全部进行修改。Second:工程都有一个class前缀, 我们要取一个长一点的class前缀, 并且这个类前缀在你的整个工程一定是一个唯一的字符串, 我们假设这个类前缀是iosMaJiaBao, 现在我们需要生成一个控制器, 控制器的结尾Controller也需要用一个特定的字符去代替, 比如:Director,剩下的View以及object做法类似, 就不一一介绍了,做马甲的时候就是把这些名字用另一个唯一的字符去代替, 尽量长一点。Third:把另一个其他的工程中的类全部导入进来, 作用是混淆代码, 在现有的工程中调用, 可以没有任何效果, 只是单纯相互调用而已~~~
别想着单一加垃圾代码,没用的!!!
其实还有很多别的情况,下次再一一解释并给出解决方案吧,今天有点懒了呢~
> 马甲包是利用各大市场规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致。
至于为什么做马甲包,能读这篇文章的自然也不需要我多说什么了吧,引流、抗风险、关键词覆盖、刷榜,对于一些灰色产业或者用户获取竞争激烈的行业领域来说,意义非凡。但是苹果爸爸可不允许这种情况发生,马甲包在审核环节,是非常容易被拒的,毕竟破坏苹果商店公平性的东西,是不被允许的。
当然,我们对iOS的审核机制进行了深入的研究和尝试,马甲包也是成功上架过很多了。马甲包该如何上架呢?找我就好啦~ 哈哈哈!!言归正传,下文详述。
那么马甲包该如何上架?
需要马甲包代上架的可以联系我,QQ:1481983952
马甲包被拒最常见的4.3被拒
- 3 Design: SpamGuideline 4.3 - Design
首先4.3基本是机器审,是你之前用这套源码上过一个包,现在用这套代码直接改一个logo跟名字再上一个马甲,这种基本会直接4.3
这种情况基本要改源码,First:文件夹的名字全部进行修改。Second:工程都有一个class前缀, 我们要取一个长一点的class前缀, 并且这个类前缀在你的整个工程一定是一个唯一的字符串, 我们假设这个类前缀是iosMaJiaBao, 现在我们需要生成一个控制器, 控制器的结尾Controller也需要用一个特定的字符去代替, 比如:Director,剩下的View以及object做法类似, 就不一一介绍了,做马甲的时候就是把这些名字用另一个唯一的字符去代替, 尽量长一点。Third:把另一个其他的工程中的类全部导入进来, 作用是混淆代码, 在现有的工程中调用, 可以没有任何效果, 只是单纯相互调用而已~~~
别想着单一加垃圾代码,没用的!!!
其实还有很多别的情况,下次再一一解释并给出解决方案吧,今天有点懒了呢~
uniapp向webview中发送消息
uniapp向webview中发送消息
在业务开发中,使用webview嵌套了vue开发的h5页面,进行套壳打包,其一需求是,在h5中获取当前app的版本号,就涉及到了uniapp向webview传递消息的场景
uniapp 中代码
核心为获取到webview窗口,然后通过evalJS执行h5中的方法
- setVersion方法为h5页面中定义的全局方法
<template>
<view class="content">
<!-- 开发 -->
<web-view @message="onMessage" :webview-styles="webviewStyles" src="http://192.168.1.158:3000"></web-view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'Hello',
webviewStyles: {
progress: {
color: '#f0b90b'
}
},
wv: null,
};
},
onLoad() {
const self = this;
// #ifdef APP-PLUS
let currentWebview = this.$scope.$getAppWebview();
setTimeout(function() {
let wv = currentWebview.children()[0];
self.wv = wv;
self.setVersion();
}, 1000);
// #endif
},
methods: {
// 设置版本号
setVersion() {
const self = this;
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
self.wv.evalJS("setVersion('" + widgetInfo.version + "')");
});
},
// 接收消息
onMessage(e) {
const self = this;
console.log('我收到了网页发来的消息', e.detail.data);
let data = e.detail.data;
},
}
};
</script>
h5 中代码
App.vue
// 设置版本号
window.setVersion = (id) => {
localStorage.setItem("version", version);
};
然后就可以在h5中获取使用了
注意
尽量不要uni生命周期中直接调用h5里面的方法,要等h5加载完成后,才可以调用
uniapp向webview中发送消息
在业务开发中,使用webview嵌套了vue开发的h5页面,进行套壳打包,其一需求是,在h5中获取当前app的版本号,就涉及到了uniapp向webview传递消息的场景
uniapp 中代码
核心为获取到webview窗口,然后通过evalJS执行h5中的方法
- setVersion方法为h5页面中定义的全局方法
<template>
<view class="content">
<!-- 开发 -->
<web-view @message="onMessage" :webview-styles="webviewStyles" src="http://192.168.1.158:3000"></web-view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'Hello',
webviewStyles: {
progress: {
color: '#f0b90b'
}
},
wv: null,
};
},
onLoad() {
const self = this;
// #ifdef APP-PLUS
let currentWebview = this.$scope.$getAppWebview();
setTimeout(function() {
let wv = currentWebview.children()[0];
self.wv = wv;
self.setVersion();
}, 1000);
// #endif
},
methods: {
// 设置版本号
setVersion() {
const self = this;
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
self.wv.evalJS("setVersion('" + widgetInfo.version + "')");
});
},
// 接收消息
onMessage(e) {
const self = this;
console.log('我收到了网页发来的消息', e.detail.data);
let data = e.detail.data;
},
}
};
</script>
h5 中代码
App.vue
// 设置版本号
window.setVersion = (id) => {
localStorage.setItem("version", version);
};
然后就可以在h5中获取使用了
注意
尽量不要uni生命周期中直接调用h5里面的方法,要等h5加载完成后,才可以调用
收起阅读 »





