更新记录
1.0.3(2026-08-10)
- 修复 iOS 云打包 UTS→Swift 编译失败:补齐
XviewShareRemoteHeader 引用、收窄远程 MIME 的 String?,并将远程下载桥接数值参数改为 NSNumber 以匹配 UTS number。
- 继续加固 iOS 侧 split/自定义数组下标与
join 空安全,降低同类可选类型编译风险。
1.0.2(2026-08-05)
- 修复 Android 指定单应用(
targetPackages 仅一个包名)分享多图时被提前截断为单图的问题;优先 ACTION_SEND_MULTIPLE,无匹配 Activity 时再回退单文件 ACTION_SEND。
1.0.1(2026-08-02)
- 新增远程分享
shareRemoteFilesAsync:App 端最多 20 个文件、三路并发、部分成功与 24 小时缓存;Web 返回 9040002。
- 新增远程任务
taskId、cancelShareRemoteFiles 与 listShareCacheFilesAsync;下载阶段可真实取消,取消后以 cancelled: true 结束 Promise。
- 补齐能力探测、缓存、Web File 示例;远程下载 Modal 支持进度、速度与取消;同步 uni-app / uni-app x 示例与文档。
- 修复 Android 虚拟路径解析、文件分享 Intent、多图权限预检、微信/QQ 候选优选,以及 Kotlin/UTS 桥接与编解码编译问题。
查看更多
平台兼容性
uni-app(4.87)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| × |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(5.0)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
√ |
√ |
√ |
√ |
× |
xview-share
跨平台系统分享 UTS 插件。统一封装 Android / iOS / HarmonyOS / Web 的系统分享能力,公共 API 一致;平台差异体现在能力边界与返回错误,不改变调用方式。
支持:文本、链接、单文件、多图片、多文件、远程多文件、系统面板预览(preview)、平台专属配置(platformOptions)。Android 额外支持按包名直达与安装检测。
功能特性
- 基础分享:文本、链接、单文件、多图片、多文件;回调与 Promise 双形态
- 远程分享:最多 20 个远程文件、下载进度、真实取消、部分成功与失败明细
- 平台增强:
preview 预览、platformOptions、Android 指定应用 / Chooser Actions、邮件收件人
- 权限与检测:运行时权限申请与静默检查、Android 包名 / iOS Scheme 安装检测
- 缓存管理:远程下载缓存统计、安全文件列表、主动清理
- Web 能力:
navigator.share 文本/链接;浏览器 File 对象分享
- 诊断能力:平台能力矩阵、统一错误码(不支持端返回
9040002 等,不抛未捕获异常)
快速使用
import {
requestSharePermission,
share,
shareAsync,
shareText,
shareTextAsync,
shareFile,
shareImages,
shareImagesAsync,
cancelShareRemoteFiles,
shareRemoteFilesAsync,
isShareAppInstalled
} from '@/uni_modules/xview-share'
// Android 分享外部媒体前可先申请权限
requestSharePermission({
type: 'file',
mimeType: '*/*',
files: [
'/storage/emulated/0/Download/a.jpg',
'/storage/emulated/0/Download/a.mp4'
],
success: (res) => {
console.log('权限', res.granted, res.permissions)
}
})
shareText({
title: '推荐应用',
text: 'xview-share 支持系统分享',
url: 'https://uniapp.dcloud.net.cn',
success: (res) => console.log('成功', res),
fail: (err) => console.log('失败', err.errCode, err.errMsg)
})
shareTextAsync({
title: 'Promise 分享',
text: 'Async 接口返回 Promise'
}).then((res) => {
console.log(res)
}).catch((err) => {
console.log(err.errCode, err.errMsg)
})
shareFile({
title: '分享文件',
file: '/storage/emulated/0/Download/report.pdf',
type: 'file',
mimeType: 'application/pdf'
})
shareImages({
title: '多图片分享',
files: [
'/storage/emulated/0/Pictures/a.jpg',
'/storage/emulated/0/Pictures/b.jpg'
]
})
shareImagesAsync({
title: 'Promise 多图片分享',
files: [
'/storage/emulated/0/Pictures/a.jpg',
'/storage/emulated/0/Pictures/b.jpg'
]
}).then((res) => {
console.log('已调起文件分享', res.sharedCount)
}).catch((err) => {
console.log(err.errCode, err.errMsg)
})
// 远程文件会先下载到插件临时缓存;每个文件可以独立配置名称、MIME 和请求头
const remoteTaskId = 'remote-demo-001'
shareRemoteFilesAsync({
taskId: remoteTaskId,
title: '远程单文件分享',
files: [
{
url: 'http://files.maxiaoqu.com/images/001.jpg',
fileName: '001.jpg',
mimeType: 'image/jpeg'
}
],
type: 'image',
mimeType: 'image/jpeg'
}).then((res) => {
console.log(res.downloadedCount, res.sharedCount)
}).catch((err) => {
console.log(err.errCode, err.errMsg, err.data)
})
// 仅下载尚未结束时可取消;成功取消后 Promise resolve cancelled: true,并清理当前批次缓存
function cancelRemoteDownload() {
const result = cancelShareRemoteFiles(remoteTaskId)
console.log('是否已取消下载任务', result.cancelled)
}
shareRemoteFilesAsync({
title: '远程多文件分享',
files: [
{
url: 'http://files.maxiaoqu.com/images/001.jpg',
fileName: '001.jpg',
mimeType: 'image/jpeg'
},
{
url: 'http://files.maxiaoqu.com/images/002.jpg',
fileName: '002.jpg',
mimeType: 'image/jpeg'
}
],
type: 'image',
mimeType: 'image/*'
}).then((res) => {
// 某个文件失败时,只要至少一个下载成功仍会调起分享,并在这里返回失败明细
console.log(res.downloadedCount, res.failedCount, res.failedFiles)
}).catch((err) => {
// 全部下载失败时 errCode 为 9040008,err.data.failures 为逐文件原因
console.log(err.errCode, err.errMsg, err.data)
})
// 仅 Android 有效
if (isShareAppInstalled({ target: 'wechat' })) {
share({
title: '分享到指定应用',
text: 'Android 自定义包名示例',
target: 'custom',
targetPackages: ['com.tencent.mm']
})
}
// 预览与平台专属配置
share({
title: '业务标题',
text: '正文',
url: 'https://uniapp.dcloud.net.cn',
type: 'url',
preview: {
title: '系统面板预览标题',
summary: '系统面板预览摘要',
image: '/storage/emulated/0/Download/preview.jpg'
},
platformOptions: {
android: { htmlText: '<p>可选 HTML 正文</p>' },
harmony: { previewMode: 'detail', selectionMode: 'batch' },
mail: { to: ['demo@example.com'] }
}
})
API
回调版通过 success / fail / complete 返回结果;*Async 与 shareRemoteFilesAsync 返回 Promise,成功 resolve 对应结果类型,失败 reject XviewShareFail(errCode + errMsg,远程全部失败时 err.data 为 XviewShareRemoteFilesErrorData)。若 Promise 版同时传入回调,回调仍会触发。完整类型定义见插件内 utssdk/interface.uts。
| API |
结果类型 |
说明 |
share(options: XviewShareOptions) |
void |
通用分享;至少传 text / url / file / files 之一;调起系统面板即视为成功 |
shareAsync(options: XviewShareOptions) |
Promise<XviewShareResult> |
share 的 Promise 版 |
shareText(options: XviewShareTextOptions) |
void |
文本/链接快捷分享;text 必填,可附带 url |
shareTextAsync(options: XviewShareTextOptions) |
Promise<XviewShareResult> |
shareText 的 Promise 版 |
shareFile(options: XviewShareFileOptions) |
void |
单文件快捷分享;file 必填 |
shareFileAsync(options: XviewShareFileOptions) |
Promise<XviewShareResult> |
shareFile 的 Promise 版 |
shareImages(options: XviewShareImagesOptions) |
void |
多图片快捷分享;files 必填,默认 mimeType: 'image/*' |
shareImagesAsync(options: XviewShareImagesOptions) |
Promise<XviewShareResult> |
shareImages 的 Promise 版 |
shareVideo / shareVideoAsync |
void / Promise<XviewShareResult> |
视频快捷分享;参数同 shareFile |
shareAudio / shareAudioAsync |
void / Promise<XviewShareResult> |
音频快捷分享;参数同 shareFile |
shareRemoteFilesAsync(options: XviewShareRemoteFilesOptions) |
Promise<XviewShareRemoteFilesResult> |
纯 Promise;先下载 1–20 个远程文件再调起分享;至少一个成功则 resolve 并附带 failedFiles |
shareRemoteFileAsync(options: XviewShareRemoteFileOptions) |
Promise<XviewShareRemoteFilesResult> |
单远程文件快捷入口 |
cancelShareRemoteFiles(taskId) / cancelShareRemoteFilesAsync(taskId) |
XviewShareRemoteCancelResult / Promise<…> |
仅取消仍在下载阶段的指定任务;成功时清理该任务当前批次缓存 |
requestSharePermission(options: XviewSharePermissionOptions) |
void |
Android 按 type / mimeType / 路径申请读取权限;其他端直接返回 granted: true |
requestSharePermissionAsync(options: XviewSharePermissionOptions) |
Promise<XviewSharePermissionResult> |
权限申请 Promise 版 |
checkSharePermission(options) / checkSharePermissionAsync(options) |
void / Promise<XviewSharePermissionResult> |
只检查权限,不弹出系统权限框 |
isShareAppInstalled(options: XviewShareAppInstalledOptions) |
boolean |
Android 检测候选包;iOS 检测 iosSchemes(宿主须声明白名单);其他端固定 false |
getShareCapabilities() / getShareCapabilitiesAsync() |
XviewShareCapabilities / Promise<…> |
查询当前设备与实现端的真实能力快照 |
getShareCacheInfoAsync() |
Promise<XviewShareCacheInfo> |
查询远程下载缓存的文件数、批次数和字节数 |
listShareCacheFilesAsync() |
Promise<XviewShareCacheListResult> |
按更新时间倒序返回最多 100 条缓存文件元数据,不返回 App 私有绝对路径 |
clearShareCacheAsync() |
Promise<XviewShareCacheInfo> |
清理全部远程分享缓存,返回清理后统计 |
listShareAppsAsync(options: XviewShareAppListOptions) |
Promise<XviewShareApp[]> |
Android 查询能处理指定 MIME 的应用;其他端返回空数组 |
shareWebFiles(options) / shareWebFilesAsync(options) |
void / Promise<XviewShareResult> |
仅 Web;files 须为浏览器受信来源的 File 对象 |
类型定义
type XviewShareType = 'text' | 'url' | 'image' | 'video' | 'audio' | 'file'
type XviewShareTarget =
| 'system' // 完整系统分享面板
| 'wechat' | 'qq' | 'dingtalk' | 'feishu' | 'weibo'
| 'mail' // 邮件;iOS 使用 MFMailComposeViewController
| 'custom' // Android 自定义包名;需配合 targetPackages
type XviewSharePreviewOptions = {
title?: string // 预览标题;空则回退 options.title
summary?: string // 预览摘要;Android 文本/链接/邮件会合并进 EXTRA_TEXT
image?: string // 本地缩略图;Web 忽略
}
type XviewSharePlatformOptions = {
android?: { htmlText?: string } // Intent.EXTRA_HTML_TEXT
ios?: { excludedActivityTypes?: string[] } // 排除的 ActivityType
harmony?: {
previewMode?: 'default' | 'detail' // 默认 default
selectionMode?: 'single' | 'batch' // 默认 batch
}
mail?: { to?: string[]; cc?: string[]; bcc?: string[] } // 邮件收件人
}
type XviewShareOptions = {
title?: string
text?: string
url?: string // 须 http:// 或 https://
file?: string // 单文件;支持绝对路径、file://、content://、_doc 等
files?: string[] // 多文件/多图
type?: XviewShareType
mimeType?: string
target?: XviewShareTarget // 默认 system
targetPackages?: string[] // target 为 custom 时必填
chooserTitle?: string // Android 分享面板标题
preview?: XviewSharePreviewOptions
platformOptions?: XviewSharePlatformOptions
success?: (res: XviewShareResult) => void
fail?: (err: XviewShareFail) => void
complete?: (res: any) => void
}
type XviewShareRemoteFile = {
url: string // HTTP/HTTPS 地址
fileName?: string // 缓存文件名;不传则从响应头或 URL 推导
mimeType?: string // 单文件 MIME;优先于 Content-Type
headers?: Array<{ name: string; value: string }> // 当前文件专属请求头;不会写入日志
}
type XviewShareRemoteFilesOptions = {
title?: string
text?: string
files: XviewShareRemoteFile[] // 必填,1–20 个
type?: XviewShareType // 默认 file
mimeType?: string // 不传则按成功文件汇总
target?: XviewShareTarget
targetPackages?: string[]
chooserTitle?: string
preview?: XviewSharePreviewOptions
platformOptions?: XviewSharePlatformOptions
timeoutMs?: number // 整批超时;默认且最大 1200000(20 分钟)
maxFileBytes?: number // 单文件上限;默认且最大 52428800(50MB)
maxTotalBytes?: number // 整批上限;默认且最大 209715200(200MB)
}
type XviewShareResult = {
errCode: 0
errMsg: string
platform: 'android' | 'ios' | 'harmony' | 'web'
target: XviewShareTarget
targetPackage: string // Android 命中包名;其他端为空串
activityType: string // iOS ActivityType;其他端为空串
sharedCount: number // 参与分享的本地文件数
completed: boolean | null // iOS 可确认是否完成;其他端固定 null,见下文说明
}
type XviewSharePermissionResult = {
errCode: 0
errMsg: string
platform: string
granted: boolean
permissions: string[]
}
type XviewShareRemoteFilesResult = XviewShareResult & {
requestedCount: number
downloadedCount: number
failedCount: number
failedFiles: Array<{
index: number
url: string
fileName: string
errCode: XviewShareErrorCode
errMsg: string
httpStatus: number
}>
}
share 参数
| 参数 |
类型 |
说明 |
title |
string |
分享标题 |
text |
string |
正文;shareText / shareTextAsync 中必填 |
url |
string |
http:// / https:// 链接 |
file |
string |
单文件本地路径 |
files |
string[] |
多文件路径;多图配合 type: 'image' |
type |
XviewShareType |
内容类型;不传时按入参推断 |
mimeType |
string |
自定义 MIME |
target |
XviewShareTarget |
分享目标,默认 system |
targetPackages |
string[] |
Android 候选包名;custom 时必填 |
chooserTitle |
string |
Android 分享面板标题 |
preview |
XviewSharePreviewOptions |
系统面板预览 |
platformOptions |
XviewSharePlatformOptions |
平台专属配置 |
success / fail / complete |
function |
回调;Promise 版可选,传入后仍会触发 |
快捷方法复用上表字段子集:shareText 需 text;shareFile 需 file;shareImages 需 files。
shareRemoteFilesAsync 参数
| 参数 |
类型 |
说明 |
taskId |
string |
可选任务标识;由调用方为每次下载生成唯一值,用于取消当前下载任务 |
title / text |
string |
分享标题与可选正文;目标 App 决定是否接收 |
files |
XviewShareRemoteFile[] |
必填,1 至 20 个远程文件 |
files[].url |
string |
HTTP/HTTPS 地址 |
files[].fileName |
string |
可选缓存文件名 |
files[].mimeType |
string |
单文件 MIME |
files[].headers |
{name,value}[] |
当前文件专属请求头 |
type / mimeType |
string |
批量分享类型与总 MIME |
target / targetPackages |
string / string[] |
与本地分享一致 |
chooserTitle / preview / platformOptions |
object |
复用现有分享配置 |
timeoutMs |
number |
整批超时,默认且最大 1200000(20 分钟) |
maxFileBytes |
number |
单文件上限,默认且最大 52428800(50MB) |
maxTotalBytes |
number |
整批上限,默认且最大 209715200(200MB) |
onProgress |
function |
下载进度回调;各端会节流,避免高频刷新 UI |
行为说明:
- 限制参数只允许调小;最多 20 个文件、三路并发。
- 至少一个文件下载成功时继续分享并 resolve;
failedFiles 按输入索引返回跳过项。
- 全部失败时 reject
9040008,err.data 为 { requestedCount, failures }。
- 调用
cancelShareRemoteFiles(taskId) 仅在下载阶段有效;任务已进入系统分享、已结束或不存在时返回 cancelled: false。成功取消会停止网络下载、清理当前批次缓存,原 Promise 会 resolve 并返回 cancelled: true,不会打开系统分享面板。
- 缓存按调用批次隔离,成功文件保留给接收 App 延迟读取;下一次远程分享会清理超过 24 小时的批次。
- 文件名优先级:显式
fileName、响应建议名、URL 路径、自动名称。
- MIME 优先级:单文件配置、响应
Content-Type、扩展名、application/octet-stream。
requestSharePermission 参数
| 参数 |
类型 |
说明 |
type |
XviewShareType |
默认 file;Android 13+ 仅 image/video/audio 触发对应 READ_MEDIA_* |
mimeType |
string |
辅助判断媒体权限;*/* 会申请图片+视频+音频 |
file |
string |
单文件路径;content:// 通常无需再次申请 |
files |
string[] |
多文件路径 |
success / fail / complete |
function |
回调 |
isShareAppInstalled 参数
| 参数 |
类型 |
说明 |
target |
XviewShareTarget |
预置目标;custom 时需配合 targetPackages |
targetPackages |
string[] |
候选包名;返回是否至少有一个已安装 |
iosSchemes |
string[] |
仅 iOS:待检查 URL Scheme(如 weixin);宿主必须声明 LSApplicationQueriesSchemes |
错误码
| 错误码 |
说明 |
| 9040001 |
分享内容为空 |
| 9040002 |
当前平台不支持该能力 |
| 9040003 |
链接必须以 http:// 或 https:// 开头 |
| 9040004 |
文件路径无效、文件不存在或当前 App 无读取权限 |
| 9040005 |
指定应用未安装或不支持当前分享类型 |
| 9040006 |
系统分享调起失败 |
| 9040007 |
用户取消系统分享 |
| 9040008 |
远程文件下载失败 |
| 9040009 |
远程文件数量、大小或批次资源超过限制 |