更新记录
1.0.0(2026-08-03)
- 首发 Android / iOS / HarmonyOS 后台传输 UTS 插件
- 单任务与批量上传下载、断点续传、校验和、去重、分组调度
- 三端原生传输与通知;可选导出到用户 Download
- 通知 open-page 跳转(
watchNotificationClick/stopWatcher) - 修复 HarmonyOS 通知正文点击只拉起应用、不进入
pagesx/list/list:API 12 使用 NotificationKit WantAgent,并监听 EntryAbility 冷/热启动 Want 派发 open-page 事件 - 修复 HarmonyOS 文件字节已下载完成却被标记失败:公共 Download 不支持静默写入时保持任务
completed,手动exportFile改用 DocumentViewPicker 授权保存 - 修复 HarmonyOS API 12 通知发布缺少
notificationContentType,并保留失败任务的 Request Agent 供后续恢复/重试 - API 以
interface.uts为准;示例见pages/transfer/、pagesx/transfer/
平台兼容性
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 后台文件传输(xview-transfer)
面向 uni-app 与 uni-app x 的 Android、iOS、HarmonyOS 三端原生后台文件传输 UTS 插件。公共 API 以 utssdk/interface.uts 为准;不支持 Web 或小程序,未支持端不伪造成功。
功能特性
- 单任务传输:后台 HTTP/HTTPS 下载与上传,支持暂停、恢复、取消、失败重试
- 批量分组:
startBatchDownload/startBatchUpload,组级暂停/恢复/取消/删除 - 进度与状态:
watchTasks/watchGroups;startDownload/startUpload支持 options 内便捷回调 - 系统通知:Android/iOS 本地通知(进度与操作按钮);HarmonyOS 使用 NotificationKit 可点击进度通知
- 通知跳转:点击通知正文写入 open-page 事件,由 App 层消费并跳转(插件内不调用
uni.navigateTo) - 续传与校验:下载 HTTP
Range;上传 HTTPContent-Range(需服务端配合);可选 MD5/SHA256 - 去重与持久化:默认同 URL/路径去重;任务快照跨进程持久化
- Download 导出:传输成功后可选复制副本到用户可访问目录,不覆盖同名文件
集成步骤
- 将
uni_modules/xview-transfer放入项目uni_modules目录。 App.onLaunch调用initTransfer(),并配置通知 open-page(见下文)。- 传输前调用
requestNotificationPermission()申请或检查通知权限。 - 使用
startDownload/startUpload或批量 API 创建任务;通过errCode === 0判断成败。
import { initTransfer, requestNotificationPermission, startDownload } from '@/uni_modules/xview-transfer'
initTransfer()
const permission = await requestNotificationPermission()
if (!permission.granted) {
console.warn('通知未授权', permission.errMsg)
}
const result = await startDownload({
url: 'https://example.com/files/report.pdf',
notificationTitle: '下载报告',
exportToDownloads: true,
: (event) => {
console.log('progress', event.task.progress, event.task.bytesTransferred)
}
})
if (result.errCode !== 0 || result.task == null) {
console.error(result.errCode, result.errMsg)
} else {
console.log('taskId', result.task.taskId)
}
任务状态
| 状态 | 含义 |
|---|---|
queued |
已创建,等待调度 |
running |
传输中 |
paused |
已暂停,可恢复 |
completed |
成功完成 |
failed |
失败,可 retryTask |
cancelled |
已取消 |
removed |
仅作 removeTask 返回状态,不出现在列表查询 |
progress 为 -1 表示服务端未提供总长度,页面应显示「不确定进度」。canResume 为 false 时,resumeTask 可能从头重新开始,不会假装沿用旧偏移。
API 一览
异步任务 API 均返回 Promise,不会 throw;通过 errCode / errMsg 判断成败(errCode === 0 为成功)。完整类型见 utssdk/interface.uts。
| API | 说明 |
|---|---|
initTransfer() |
初始化:注册通知分类、恢复批量调度器 |
destroyTransfer() |
销毁:释放 watcher 与调度器状态 |
setConfig(config) |
设置全局传输配置 |
getConfig() |
读取全局传输配置 |
startDownload(options) |
创建并开始后台下载 |
startUpload(options) |
创建并开始后台上传 |
startBatchDownload(options) |
创建并开始批量下载 |
startBatchUpload(options) |
创建并开始批量上传 |
getTask(taskId) |
查询单任务;不存在时 errCode 为 9080005 |
listTasks() |
查询当前持久化任务列表 |
queryTasks(filter) |
按条件查询任务 |
getGroup(groupId) |
查询分组快照与聚合进度 |
pauseTask(taskId) |
暂停任务 |
resumeTask(taskId) |
恢复已暂停或可恢复失败的任务 |
retryTask(taskId, resetProgress?) |
重试失败任务 |
cancelTask(taskId) |
取消任务 |
removeTask(taskId) |
删除任务元数据与通知,不删除磁盘文件 |
pauseGroup(groupId) |
暂停组内可暂停任务 |
resumeGroup(groupId) |
恢复组内可恢复任务 |
cancelGroup(groupId) |
取消组内活动任务 |
removeGroup(groupId) |
删除组内任务元数据 |
clearCompleted(filter?) |
清理已完成/已取消/已失败任务元数据 |
deleteFile(taskId, options?) |
删除任务关联本地文件 |
exportFile(taskId) |
手动导出到用户 Download |
getStorageInfo() |
读取插件管理的存储占用 |
watchTasks(options) |
监听任务进度与状态 |
watchGroups(options) |
监听分组进度与状态 |
stopWatcher(watcherId) |
停止 watcher(含通知点击监听) |
requestNotificationPermission() |
请求或检查通知权限 |
setNotificationOpenPage(target) |
配置通知正文默认跳转页 |
watchNotificationClick(callback) |
监听通知正文点击 |
consumeNotificationClick() |
主动拉取一条通知点击事件 |
跨端纯逻辑工具
由三端 index.uts 再导出,逻辑与 shared.uts 一致。uni-app .vue 示例请使用 pages/utils/transfer-helpers.js,避免 Android 自定义基座对纯函数生成 ByJs 桥接异常。
| API | 说明 |
|---|---|
formatBytes(bytes) |
格式化字节数 |
resolveDisplayName(task) |
提取展示文件名 |
parseListTab(tab) |
tab → download / upload |
parseListRouteParams(url) |
解析列表页路由参数 |
buildNavigateUrl(listPath, event) |
通知事件 → navigateTo URL |
normalizeNotifyClick(event) |
规整通知点击事件 |
isValidNotifyClick(event) |
判断是否可跳转 |
常用参数
XviewDownloadOptions 必填 url;可选 destinationPath、headers、exportToDownloads、expectedChecksum、checksumAlgorithm、dedupe、onProgress、onStateChange 等。
XviewUploadOptions 必填 url、sourcePath;可选 method(默认 PUT)、resumable(默认 true)、mimeType 等。
XviewBatchDownloadOptions / XviewBatchUploadOptions 必填 items;可选 groupId、sequential、maxConcurrent、onGroupProgress、onGroupStateChange 等。
XviewTransferConfig 默认值:
| 字段 | 默认 |
|---|---|
maxConcurrent |
3 |
connectTimeout |
20000 ms |
readTimeout |
60000 ms |
defaultExportToDownloads |
false |
defaultDedupe |
true |
任务快照 XviewTransferTask、返回值 XviewTransferResult / XviewTransferBatchResult / XviewTransferGroupResult 等完整字段定义见 utssdk/interface.uts。
通知正文 open-page
Android/iOS 传输通知的动作按钮为暂停/继续/取消;Android、iOS、HarmonyOS 的通知正文点击都会写入 open-page 事件,由 App 在 onShow 消费并跳转。
HarmonyOS API 12 的 Request Agent gauge 不能配置点击 WantAgent,因此 Harmony 端由插件发布可点击的进度通知,并通过 EntryAbility onCreate/onNewWant 覆盖冷启动与热启动点击。拒绝通知权限不会中断后台传输,但不会显示这条可点击通知。
import {
setupNotificationApp,
pollNotificationApp,
drainPendingNavigateUrl
} from '@/pages/utils/notification.js' // uni-app x:@/pagesx/utils/notification.uts
const LIST_PATH = '/pages/list/list' // uni-app x:/pagesx/list/list
// App.onLaunch
setupNotificationApp(LIST_PATH)
// App.onShow
pollNotificationApp(LIST_PATH)
const url = drainPendingNavigateUrl()
if (url.length > 0) {
uni.navigateTo({ url, fail: () => uni.reLaunch({ url }) })
}
底层 API:setNotificationOpenPage、watchNotificationClick、consumeNotificationClick;取消监听统一使用 stopWatcher(watcherId)。
onProgress / onStateChange 与 watchTasks 回调经内部 keepAlive watcher 派发;任务进入终态后便捷回调自动释放。页面可在卸载时调用 stopWatcher(callbackWatcherId) 提前释放。
存储、权限与隐私
| 平台 | 应用内存储 | 用户 Download 导出 |
|---|---|---|
| Android | filesDir/xview-transfer/downloads/ |
Download/Xview/Transfer(API 29+ MediaStore) |
| iOS | 应用沙盒 + background 会话 | Documents/Xview/Transfer(可通过「文件」App 访问) |
| HarmonyOS | 应用私有目录 | 调用 exportFile(taskId) 后由系统文件选择器选择位置 |
exportToDownloads 导出副本,不移动或删除应用内源文件。HarmonyOS 普通应用不能在后台静默写公共 Download;即使传入 exportToDownloads: true,传输也会先以应用私有文件完成,不会因公共目录不可用而标记失败。需要在应用前台由用户操作 exportFile(taskId),系统文件选择器授权成功后 task.exportedPath 返回 URI。其他平台仍按完成后自动导出处理;未导出时 task.exportedPath 为空字符串(Android 10+ 可能为 content:// URI)。
插件声明权限见 package.json → dcloudext.declaration.permissions。传输只向调用方指定的 HTTP/HTTPS 地址发送调用方指定的文件;勿将 Authorization 等令牌写入 notificationDescription 或日志。
错误码
| 错误码 | 含义 |
|---|---|
9080001 |
传输地址必须是 HTTP 或 HTTPS |
9080002 |
本地源文件或目标路径无效 |
9080003 |
当前任务状态不支持此操作 |
9080004 |
网络传输失败 |
9080005 |
任务不存在 |
9080006 |
系统后台传输服务不可用 |
9080007 |
通知权限未授权或不可用 |
9080008 |
上传服务器不支持断点续传 |
9080009 |
无法导出到用户 Download |
9080010 |
重复任务 |
9080011 |
文件校验和不匹配 |
9080012 |
批量参数无效 |
9080013 |
分组不存在 |
需要 UniError 语义时可使用 utssdk/unierror.uts 中的 XviewTransferFailImpl。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 27
赞赏 0
下载 12477400
赞赏 1936
赞赏
京公网安备:11010802035340号