更新记录

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-appuni-app x 的 Android、iOS、HarmonyOS 三端原生后台文件传输 UTS 插件。公共 API 以 utssdk/interface.uts 为准;不支持 Web 或小程序,未支持端不伪造成功。

功能特性

  • 单任务传输:后台 HTTP/HTTPS 下载与上传,支持暂停、恢复、取消、失败重试
  • 批量分组startBatchDownload / startBatchUpload,组级暂停/恢复/取消/删除
  • 进度与状态watchTasks / watchGroupsstartDownload / startUpload 支持 options 内便捷回调
  • 系统通知:Android/iOS 本地通知(进度与操作按钮);HarmonyOS 使用 NotificationKit 可点击进度通知
  • 通知跳转:点击通知正文写入 open-page 事件,由 App 层消费并跳转(插件内不调用 uni.navigateTo
  • 续传与校验:下载 HTTP Range;上传 HTTP Content-Range(需服务端配合);可选 MD5/SHA256
  • 去重与持久化:默认同 URL/路径去重;任务快照跨进程持久化
  • Download 导出:传输成功后可选复制副本到用户可访问目录,不覆盖同名文件

集成步骤

  1. uni_modules/xview-transfer 放入项目 uni_modules 目录。
  2. App.onLaunch 调用 initTransfer(),并配置通知 open-page(见下文)。
  3. 传输前调用 requestNotificationPermission() 申请或检查通知权限。
  4. 使用 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 表示服务端未提供总长度,页面应显示「不确定进度」。canResumefalse 时,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) 查询单任务;不存在时 errCode9080005
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;可选 destinationPathheadersexportToDownloadsexpectedChecksumchecksumAlgorithmdedupeonProgressonStateChange 等。

XviewUploadOptions 必填 urlsourcePath;可选 method(默认 PUT)、resumable(默认 true)、mimeType 等。

XviewBatchDownloadOptions / XviewBatchUploadOptions 必填 items;可选 groupIdsequentialmaxConcurrentonGroupProgressonGroupStateChange 等。

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:setNotificationOpenPagewatchNotificationClickconsumeNotificationClick;取消监听统一使用 stopWatcher(watcherId)

onProgress / onStateChangewatchTasks 回调经内部 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.jsondcloudext.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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。