问题背景
使用uni app跨平台,编译运行到ios上,发现分享图文的时候,图片无法显示,在安卓上分享正常。
uni.share({
provider: "weixin",
scene: "WXSenceTimeline",
type: 2,
imageUrl: "https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/d8590190-4f28-11eb-b680-7980c8a877b8.png",
success: function (res) {
console.log("success:" + JSON.stringify(res));
},
fail: function (err) {
console.log("fail:" + JSON.stringify(err));
}
});
问题分析
从log查看,没有图片的原因是因为,IOS端分享朋友圈规定图片不能大于20kb,因此项目代码中做了压缩,在压缩之前通过5+app里面的plus.io.resolveLocalFileSystemURL方法选取的图片获取图片地址(这个方法其实有些多此一举,当然之前项目别人这样写的,只能按照这样去踩坑了),然后进行压缩,
调试过程中log打印错误提示有三种:
(1)编码格式不正确 ---》本地文件要添加“file://”
(2)文件没有发现 ---》文件不存在,地址或文件名不正确
(3)不允许读 --》地址不正确
plus.io.resolveLocalFileSystemURL方法是通过url参数获取文件对象
void plus.io.resolveLocalFileSystemURL( url, succesCB, errorCB );
说明:
快速获取指定的目录或文件操作对象,如通过URL值“_www/test.html”可直接获取文件操作对象。
url值可支持相对路径URL、本地路径URL、网络路径URL(http://localhost:13131/开头)。 //在IOS上不支持网络路径
获取指定的文件或目录操作对象成功通过succesCB回调返回,如果指定URL路径或文件不存在则失败通过errorCB回调返回
- url : ( DOMString ) 必选 要操作文件或目录的URL地址
- succesCB: ( FileResolveSuccessCallback ) 必选 获取操作文件或目录对象成功的回调函数
- errorCB: ( FileErrorCallback ) 可选 获取操作文件或目录对象失败的回调函数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>File Example</title>
<script type="text/javascript">
// 扩展API加载完毕后调用onPlusReady回调函数
document.addEventListener( "plusready", onPlusReady, false );
// 扩展API加载完毕,现在可以正常调用扩展API
function onPlusReady() {
plus.io.resolveLocalFileSystemURL( "_www/test.html", function( entry ) {
// 可通过entry对象操作test.html文件
entry.file( function(file){
var fileReader = new plus.io.FileReader();
alert("getFile:" + JSON.stringify(file));
fileReader.readAsText(file, 'utf-8');
fileReader.onloadend = function(evt) {
alert("11" + evt);
alert("evt.target" + evt.target);
alert(evt.target.result);
}
alert(file.size + '--' + file.name);
} );
}, function ( e ) {
alert( "Resolve file URL failed: " + e.message );
} );
}
</script>
</head>
<body>
Request file system
</body>
</html>
解决方案:
1.路径问题解决:
(1)ios中只允许访问_www、_doc、_documents、_downloads四个目录的文件,保证本地文件是否在这4个目录之一
如: let imgPath = '_www/static/imgs/logo.png' //本地路径(static同项目的static资源目录)
let tempPath = 'file://' + plus.io.convertLocalFileSystemURL(imgPath) //前面必须加file://
plus.io.resolveLocalFileSystemURL(tempPath, file)
(2)在真机中确认文件是否存在
IOS不同安卓,没法直接用adb指令或通过文件管理查看内部文件,在windows上需要借助第三方工具(mac系统上有其它工具)
这里可以使用Itools工具: Itools官网
下载之后,连接手机:
应用 --》 我的应用 --》找到需要查看的应用,选择文件共享
路径:apps后面一串数字,每次安装应用都不同,随机生成的,在这可以看到www, doc
/Documents/Pandora/apps/D17DABE4B3040329D8515E93A8D97974/www/static/imgs
同时在ios上还发现,分享的图文的时候,如果图片使用的是网络地址,则图片获取不到,此时需要将图片先下载到本地,然后再分享
下载网络图片的方法:uni.getImageInfo