uni.shareWithSystem仅呼起系统原生分享面板,支持文本、本地图片及合法路径文件(如PDF),但不支持网络URL、临时路径或私有目录路径;Android需content://URI或plus.io转换路径,iOS需Documents/Library目录下小写扩展名文件。

uni.shareWithSystem 能分享什么?
它只负责呼起系统原生的“分享面板”,不挑内容类型,但对输入格式很敏感。你传进去的必须是系统能识别的资源路径或纯文本,不能是网络 URL、临时缓存路径(如 tmp/xxx.pdf),也不能是私有目录下的绝对路径(如 /data/user/0/com.xxx/files/report.pdf)。iOS 和 Android 对路径合法性判断不同:Android 要求是 content:// URI 或通过 plus.io.convertLocalFileSystemURL() 转换后的合法本地路径;iOS 则要求文件必须在 Documents/ 或 Library/Caches/ 等共享目录下。
分享文本时为什么 QQ 只显示链接?
这是 QQ SDK 在 Android 平台的硬性限制:type: 1(纯文本)必须同时传 href,否则直接报错 "share:fail 非纯图片分享必须传递链接地址!"。但它会优先展示 href,把 summary 当作摘要弱化处理。解决办法只有一个:把文本塞进 href 的 query 参数里,再配一个无意义但合规的域名前缀。
href: "https://a.b/c?text=" + encodeURIComponent("用户填写的分享文案")- 保留
summary字段,部分平台(如微博)仍会读取它 - iOS 上可绕过此限制,
type: 1单独传summary即可生效
分享 PDF/Excel 等文件必须走 native 插件?
是的。uni.share 不支持 type 为文件类型,官方 API 没有定义对应枚举值。你看到的“分享文件”效果,本质都是调用 uni.shareWithSystem 或封装好的原生插件(如 life-FileShare)触发系统级分享。关键点在于路径转换:
- 先用
uni.downloadFile或plus.downloader.createDownload把文件落地到可共享目录 - Android:用
plus.io.convertLocalFileSystemURL(filePath)转成系统可识别路径 - iOS:确保文件已写入
_doc/或_www/下,且扩展名小写(.PDF→.pdf) - 中文文件名必须 URL 编码,否则微信会截断(如
发票.pdf→%E5%8F%91%E7%A5%A8.pdf)
安卓分享 PDF 到微信失败的常见原因
不是代码没写对,而是权限和路径双重卡死。最常踩的三个坑:
- 未在
manifest.json的 “Android 设置” → “SDK 配置” 中勾选 “文件分享” 权限(云打包才生效) - 文件下载后没校验完整性,
status !== 200就直接调用分享,结果传了个空文件 - 路径含非法字符:微信拒绝处理带
/、\、?、&的文件名,哪怕只是出现在路径中间
真正稳定的路径生成逻辑是:先用 new Date().getTime() 生成唯一文件名,再拼上小写扩展名,最后用 encodeURIComponent 包一层。











