uni-app 最新版HbuilderX ios在WKWebview下 canvas对象异常
uni-app 最新版HbuilderX ios在WKWebview下 canvas对象异常
详细问题描述
(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)
[内容]
运行环境
- win10
- HBuilderX 版本2.3.3.20190923
- 链接ios真机运行
- ios12
- iphone6SPlus
已测试,同样的代码使用UIWebview正常,使用WKWebview会导致canvas对象异常。
var img = new Image(),
canvas = document.createElement("canvas"),
ctx = canvas.getContext("2d");
img.crossOrigin = "Anonymous";
img.onload = function() {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage( img, 0, 0 );
console.log(canvas.toDataURL("image/png"));
}
img.src = src;
这里的src如果选择网络资源表现正常;
如果是使用plus.gallery.pick获取到的本地文件,会抛异常,canvas无法正常执行,添加了crossOrigin也无效。
更多关于uni-app 最新版HbuilderX ios在WKWebview下 canvas对象异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
https://ext.dcloud.net.cn/plugin?id=123未能解决我的问题,
最后发现是这么处理的
var _this = this;
plus.gallery.pick(function(a) {
plus.io.resolveLocalFileSystemURL(a, function(entry) {
var imgPath = entry.toRemoteURL();//原来是 entry.toLocalURL()
更多关于uni-app 最新版HbuilderX ios在WKWebview下 canvas对象异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
上网查了两天两夜,最后按照楼上的方案搞定了。
真的是万分感谢,找个好久的解决方案,我给跪了。
如果canvas使用网络图像遇到跨域问题,需要服务端设置图像的响应头:Access-Control-Allow-Origin
如果canvas使用本地图像遇到跨域问题,可以使用plus接口将图像转换为base64再使用,相关插件:https://ext.dcloud.net.cn/plugin?id=123
我也解决了,mui写切换wkwebview本地canvas失效的问题,感谢楼主
你好,请问刚开发一个app,在测试时所有功能正常。但打包后安装在安卓手机上获取不到ajax请求的数据,点击跳转到新窗口的图表也显示不出来怎么回事?
这是一个已知的WKWebview与本地文件系统的兼容性问题。在WKWebview下,由于iOS的安全策略限制,直接操作本地文件路径的canvas会触发CORS错误。
解决方案:
- 对于从相册选取的图片,建议先使用plus.io.resolveLocalFileSystemURL转换为base64格式再处理
plus.gallery.pick(function(e){
plus.io.resolveLocalFileSystemURL(e.files[0], function(entry){
entry.file(function(file){
var reader = new plus.io.FileReader();
reader.onloadend = function(evt){
var base64 = evt.target.result;
// 使用base64数据
img.src = base64;
};
reader.readAsDataURL(file);
});
});
});
- 或者使用uni-app的uni.getImageInfo API获取临时路径:
uni.chooseImage({
success: (res) => {
uni.getImageInfo({
src: res.tempFilePaths[0],
success: (info) => {
img.src = info.path;
}
});
}
});