更新记录
1.0.2(2026-03-18)
优化 Android 分享逻辑,移除 queryIntentActivities 检测,改为异常捕获实现,提升兼容性并消除废弃 API 警告
1.0.1(2026-03-18)
优化传入分享的ios文件路径匹配规则
1.0.0(2026-03-18)
- 发布原生分享能力
- 支持任意文件类型分享
- 优化文件保存替代方案体验
平台兼容性
uni-app(4.0)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | - | - | √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | 12 | 1.0.0 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.0)
| Chrome | Safari | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|---|---|
| - | - | 5.0 | 1.0.0 | 12 | 1.0.0 | - | - |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
dh-share
Android / iOS 原生分享插件,调用系统分享面板或指定应用分享内容(图片 / 视频 / 音频 / 文本 / 链接 / 文件)。
uni-app 原生只能将图片和视频保存到相册,音频、PDF、文档等文件没有对应的保存 API,saveFile
只写入 App 沙盒用户不可见。分享是更优雅的替代方案:在线文件直接分享链接,本地文件通过系统分享面板让用户自主选择落盘位置(iOS"存储到文件"、Android"保存到设备"),体验远胜 App 代为保存。
快速开始
import { share, shareText, shareFile, shareUrl } from '@/uni_modules/dh-share';
import type { ShareResult, ShareFail } from '@/uni_modules/dh-share';
// 分享文本
shareText({
text: '分享插件 — 让每次分享都方便 🎙️',
title: '推荐应用',
success: (res) => console.log('分享成功'),
fail: (err) => console.error(err.errCode, err.errMsg),
});
// 分享链接
shareUrl({
url: 'https://uniapp.dcloud.net.cn/',
text: 'uni-app官网',
});
// 分享本地文件
shareFile({
file: 'file:///data/user/0/com.example/cache/recording.wav',
title: '录音文件',
});
// 组合:文件 + 说明文字
share({
file: 'file:///path/to/audio.wav',
text: '这段录音分享给你',
title: '会议录音',
});
API
share(options)
通用分享接口,支持文本、链接、文件任意组合。至少需要提供 text、url、file、files 其中一个。
ShareOptions
| 参数 | 类型 | 平台 | 说明 |
|---|---|---|---|
| text | string | All | 纯文本内容 |
| title | string | All | 分享标题(邮件主题、卡片标题) |
| subject | string | All | 邮件主题(优先级高于 title) |
| url | string | All | 链接 URL(iOS 作为 NSURL 独立对象,Android 附加到文本末尾) |
| file | string | All | 单文件路径(file:// 协议) |
| files | string[] | All | 多文件路径列表(file:// 协议) |
| mimeType | string | All | MIME 类型,不传时按扩展名自动识别 |
| targetPackage | string | Android | 目标应用包名,直接唤起指定 App |
| chooserTitle | string | Android | 分享面板标题,默认 "分享" |
| excludedActivityTypes | string[] | iOS | 排除的 UIActivity.ActivityType 列表 |
| success | function | All | 成功回调 |
| fail | function | All | 失败回调 |
| complete | function | All | 完成回调(无论成功或失败均触发) |
ShareResult
| 字段 | 类型 | 说明 |
|---|---|---|
| activityType | string | iOS:用户选择的 Activity 类型;Android:空字符串 |
shareText(options)
分享纯文本,text 必填。
shareText({
text: '要分享的文字内容',
title: '标题(可选)',
});
shareFile(options)
分享本地文件,file 或 files 至少一个。
// 单文件
shareFile({
file: 'file:///path/to/audio.wav',
});
// 多文件
shareFile({
files: ['file:///a.jpg', 'file:///b.jpg'],
mimeType: 'image/*',
});
shareUrl(options)
分享链接,url 必填。
shareUrl({
url: 'https://example.com',
text: '附带说明(可选)',
});
错误码
| 错误码 | 说明 | 建议处理 |
|---|---|---|
| 8030001 | 用户取消分享 | 静默处理,无需提示 |
| 8030002 | 系统错误 / 分享失败 | 提示用户稍后重试 |
| 8030003 | 文件不存在或路径无效 | 检查文件路径是否正确 |
| 8030004 | 指定应用未安装(targetPackage 找不到) |
提示用户安装目标应用 |
| 8030005 | 参数错误,没有可分享的内容 | 检查是否传入了 text/url/file 之一 |
shareFile({
file: filePath,
fail: (err) => {
if (err.errCode === 8030001) return; // 取消,不处理
if (err.errCode === 8030003) {
uni.showToast({ title: '文件不存在' });
} else {
uni.showToast({ title: '分享失败' });
}
},
});
Android 特有功能
指定目标应用(targetPackage)
// 直接分享到微信,不显示选择面板
share({
text: 'uni-app官网',
url: 'https://uniapp.dcloud.net.cn/',
targetPackage: 'com.tencent.mm',
fail: (err) => {
if (err.errCode === 8030004) {
uni.showToast({ title: '请先安装微信' });
}
},
});
常用包名:
| 应用 | 包名 |
|---|---|
| 微信 | com.tencent.mm |
com.tencent.mobileqq |
|
| 微博 | com.sina.weibo |
| 钉钉 | com.alibaba.android.rimet |
| 飞书 | com.ss.android.lark |
iOS 特有功能
排除分享渠道(excludedActivityTypes)
share({
text: '叮咚录音',
excludedActivityTypes: ['com.apple.UIKit.activity.Print', 'com.apple.UIKit.activity.AirDrop'],
});
常用 ActivityType:
| 常量 | 说明 |
|---|---|
com.apple.UIKit.activity.AirDrop |
AirDrop |
com.apple.UIKit.activity.Print |
打印 |
com.apple.UIKit.activity.CopyToPasteboard |
复制 |
com.apple.UIKit.activity.SaveToCameraRoll |
存储到相册 |
com.apple.UIKit.activity.Mail |
邮件 |
com.apple.UIKit.activity.Message |
短信 |
分享代替保存
uni-app 原生保存文件的限制:
uni.saveImageToPhotosAlbum/uni.saveVideoToPhotosAlbum:只能保存图片和视频到相册uni.saveFile:将文件存入 App 沙盒,用户无法在文件管理器中访问,体验差- 音频、PDF、文档等非媒体文件:没有 API 可以保存到用户可见的位置
分享是更优雅的替代方案,将内容传递给用户选择的目标应用,由目标应用完成"保存"动作:
// 场景 1:分享网页链接 / 带预览的在线资源
// shareUrl 发送的是可点击链接,适合网页、H5 页面、带预览卡片的资源
shareUrl({
url: 'https://example.com/share/report.html', // 网页地址,接收方可直接打开
text: '季度报告',
});
// 场景 2:在线文件(PDF、音频等)想让用户"保存到本地"
// ⚠️ shareUrl 只分享链接,文件内容不会传输,接收方需要再点击下载
// ✅ 正确做法:先 downloadFile 拿到本地路径,再 shareFile 发送实际文件
uni.downloadFile({
url: 'https://example.com/files/audio.wav',
success: (res) => {
// 分享实际文件内容,接收方(微信/邮件/文件 App)可直接保存
const realPath = plus.io.convertLocalFileSystemURL(res.tempFilePath);
shareFile({ file: realPath, title: '录音文件' });
},
});
// 场景 3:本地临时文件(chooseImage / chooseVideo / downloadFile 选出的文件)
// tempFilePath 可直接传入,无需下载
shareFile({
file: tempFilePath,
title: '我的文件',
});
总结:
shareUrl传链接(用户需点击才能访问),shareFile传文件本体(接收方直接获得文件)。想让用户"保存文件",优先用shareFile,iOS 面板有"存储到文件"选项,Android 有"保存到设备",用户自主选择落盘位置,体验远胜 App 代为保存。
注意事项
- 从
uni.chooseImage/uni.chooseVideo/dh-choose-file获取的路径可直接传入(已是file://格式) - 在线文件先用
uni.downloadFile下载,需通过plus.io.convertLocalFileSystemURL转换路径后再传入 - Android 系统分享弹窗弹出后,
success回调立即触发(不等用户完成操作),activityType为空字符串;iOS 在用户完成或取消后才触发 - iOS 的
activityType在用户选择并完成分享后才有值,取消时触发 fail(errCode 8030001)

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 146
赞赏 1
下载 11407894
赞赏 1879
赞赏
京公网安备:11010802035340号