uni.shareWithSystem 是 App 端调用系统分享面板的唯一可靠方式,它不依赖 SDK、不校验 AppID,直接唤起原生分享组件;需严格匹配 type 与字段(如 image 必传本地绝对路径),并做好平台判断与权限兜底。

uni.shareWithSystem 是 App 端调用系统分享面板的唯一可靠方式
别再试 uni.share 了——它在 App 端几乎必然失败,除非你已集成微信/qq SDK、配置 AppID、完成签名、且只分享小程序卡片。而 uni.shareWithSystem 不依赖任何 SDK、不校验 AppID、不走 JS-SDK 流程,直接唤起 Android 的 Intent.createChooser 或 iOS 的 UIActivityViewController,这才是真正“点一下就弹菜单”的方案。
type 和字段组合必须严格匹配目标类型
传错字段,iOS 可能静默失败,Android 可能只发文字不带图/文件:
-
type: 'text'→ 只传summary(iOS 显示为标题,Android 基本忽略title) -
type: 'image'→ 必须传imageUrl,且路径需是本地绝对路径(/storage/emulated/0/Pictures/xxx.jpg),不能是临时路径或网络地址 -
type: 'file'→ 官方文档写了,但 App 端 runtime 实际不识别;必须用file字段:{ file: '/Documents/report.pdf', summary: '报告' } -
href字段仅在type: 'link'或混合类型中生效,作为点击跳转链接,影响微信/QQ 接收端的“查看详情”行为
Android 10+ 和 iOS 文件路径是最大雷区
路径不对,分享后对方看到的就是“文件不可用”或空白页:
- Android 10+ 要求图片/文件必须存于公共目录(
Documents或Pictures),用uni.saveFile保存后,再通过uni.getSavedFileList拿真实路径,别直接传tempFilePath - iOS 上若未在
Info.plist中开启UIFileSharingEnabled = YES,分享 PDF 后对方点开可能无内容 - 不要拼接路径字符串,用
plus.io.convertLocalFileSystemURL(Android)或plus.io.resolveLocalFileSystemURL(iOS)确保路径格式合法
分享按钮触发前必须做平台判断和权限兜底
iOS 没有“分享失败但不报错”的选项,Android 则可能因缺少存储权限直接卡住:
- 调用前先
uni.getSystemInfoSync().platform === 'ios'或'android',避免在 H5 或小程序环境误执行 - Android 需提前申请
WRITE_EXTERNAL_STORAGE(targetSdkVersion MANAGE_EXTERNAL_STORAGE(≥30),否则uni.saveFile失败,后续全链路崩 - iOS 不需要运行时权限,但首次分享时系统会弹“是否允许访问照片”,用户拒绝后下次调用会静默失败,建议加一层
try/catch并提示“请在设置中开启照片权限”
真正麻烦的从来不是 API 怎么写,而是路径在哪、权限有没有、系统版本吃不吃得下——这些细节不手动验证一遍,90% 的“分享失败”问题都出在这三块上。


















