更新记录

2.0.0(2026-11-02) 下载此版本

首次发布 up-term 2.0.0 终端插件,包含统一会话 API、示例和封面图。

  • H5:基于内置 xterm.js 5.5.0 与 addon-fit 0.10.0,提供 custom 双向流终端组件、尺寸适配与全屏终端页。
  • Android:提供 Termux TerminalView/TerminalSession 适配源码;local 会话使用 /system/bin/sh PTY。原生编译、自定义基座与设备验收尚未完成,按实验性实现提供。
  • iOS:提供 SwiftTerm 1.20.0 SPM 适配源码,仅支持 custom 会话。原生编译与设备验收尚未完成,按实验性实现提供。
  • 鸿蒙 NEXT:提供实验性组件、内置终端页和请求隔离事件桥。ArkWeb 渲染位置与跨层通信仍需目标工程验证,不等同于 H5 验证通过。
  • 微信小程序不提供终端功能,只安全返回不支持。
  • 修复 Web 依赖加载、ready 回调写入重入、关闭回调和会话释放,以及鸿蒙回调保存和请求隔离。发布前 32 项 Node 行为测试、类型检查和 H5 构建通过(不代表原生设备验收)。
  • 保留设备信息与 Toast API,并明确 iOS 设备标识信息读取的隐私说明。

本版不内置 SSH 服务、WebSSH 网关、vim/htop 或完整 Termux 命令包。远程会话需由宿主提供已授权的数据源;原生端不能仅凭结构检查或平台声明认定可用于生产。封面是 API 功能示意,不是设备测试截图。


平台兼容性

up-term

up-term 跨平台终端封面

up-term 是一个 UTS uni_modules 终端插件,提供统一的会话 API,并保留 v1 的设备信息与 Toast API。

首次发布的验证边界:H5 的构建与功能验证结果见下方“发布验证记录”。Android、iOS、鸿蒙 NEXT 的原生编译、自定义基座和真机输入输出尚未完成验收,相关适配代码按实验性实现提供;不要将平台声明或 isTerminalSupported() 返回值当成已通过设备测试的证明。微信小程序不提供终端,仅返回不支持结果。

  • Android:Termux terminal-emulator + terminal-view(Apache-2.0,AAR 已内置),本地会话通过 PTY 启动 /system/bin/sh。可用命令取决于设备和宿主沙箱;插件不附带 vim、htop 或完整 Termux 工具链。
  • iOS:SwiftTerm(MIT,v1.20.0,通过 Swift Package Manager 拉取),提供终端视图适配;本轮未做 Xcode 编译和真机验收。
  • Web:xterm.js(MIT,5.5.0,分发包已内置),提供 custom 双向流和终端显示。
  • 鸿蒙 NEXT:包含 ArkWeb 组件接入及内置页面的实验性适配。uni-app 逻辑层与视图层并非可无条件混用 DOM,ArkWeb 渲染位置和 UTS/页面事件通信必须在目标工程验证,不能视为 H5 构建通过后自动支持。
  • 会话边界:插件仅在 Android 提供 local,iOS、Web、鸿蒙适配只接受 custom;远程 shell 需要宿主提供已授权的 WebSocket/SSH 网关等数据源,插件不自带 SSH 服务。

平台能力与验收状态

下表是源码提供的 API 范围,不是全端运行验收承诺。

能力 App-Android(实验性) App-iOS(实验性) H5 App-Harmony(实验性) mp-weixin
up-term-view(nvue) local / custom,待真机验证 custom,待真机验证 — — —
up-term-web(vue) — — custom 接入代码,待渲染层验证 —
openTerminalPage local / custom,待编译验证 custom,待编译验证 custom 内置页 + 事件桥,待验证 不支持
local 会话 /system/bin/sh PTY 不支持 不支持 不支持 不支持
v1 设备信息 / Toast 原生实现,待回归 原生实现,待回归 不支持 不支持 不支持

环境要求

  • HBuilderX 5.0+(iOS 侧 dependencies-spms 要求)。
  • iOS 云打包需 Xcode 16 镜像(SwiftTerm 1.20.0 基于 swift-tools 6.0)。
  • 鸿蒙 NEXT:需兼容的 HBuilderX/uni-app 鸿蒙工具链。ArkWeb 集成和事件桥尚未完成目标设备验收。
  • Android minSdkVersion 21;custom 回环实现依赖设备提供 stty。
  • xterm.js 和 Termux AAR 已内置;SwiftTerm 是锁版本的 SPM 远程依赖,首次 iOS 构建需要网络及兼容 Xcode。
  • 插件不主动申请运行时权限。getDeviceInfo() 会读取设备/应用信息(iOS 含 IDFV)并返回给宿主,不会自动上传;远程会话和隐私披露由宿主负责。

安装

将 uni_modules/up-term 拷贝进你的 uni-app 工程。Android/iOS 使用原生依赖时需重新制作自定义基座。H5 不需要原生基座;鸿蒙需按其工具链集成并验证内置页面,不能套用 H5 的构建结果。

会话模型

终端 = 终端视图 + 会话,会话类型全端 API 一致:

  • local(仅 Android):插件内置 pty 子进程 /system/bin/sh,输入渲染全部原生闭环。
  • custom(其余全部场景):JS 拥有数据流。键盘输入经 data 事件交给 JS;JS 调 write() 把远端输出喂给终端。典型用法:WebSocket 连 WebSSH 网关,socket 消息 write() 进终端,data 事件写回 socket。

用法一:嵌入式组件 up-term-view(App 端,nvue 页面)

组件为 UTS 兼容模式组件,只能在 nvue 页面使用,必须显式指定宽高:

<template>
  <view style="flex:1;background-color:#000000;">
    <up-term-view
      ref="term"
      style="width:750rpx;height:1200rpx;"
      sessionType="custom"
      :fontSize="14"
      welcomeText="up-term ready\r\n"
      @ready="onReady" @data="onData" @resize=""
      @exit="onExit" @error="onError">
    </up-term-view>
  </view>
</template>
类别 名称 说明
prop sessionType 'local'(默认,仅 Android)/ 'custom'
prop fontSize 字号(逻辑像素),默认 14
prop welcomeText custom 模式的初始输出(local 模式忽略)
event ready / resize cols、rows
event data data(键盘输入,custom 模式转发给远端)
event title / exit / error title / code / message
方法 write(data) local:写 shell stdin;custom:喂输出到屏幕
方法 kill() / setFontSize(px) / focus() / paste(text) 会话与交互控制

组件事件负载可能被序列化为 Map 或普通对象(随平台桥接而异),示例中的 ev(e, key) 助手两端通用(见 examples/terminal.nvue)。

用法二:全屏原生终端页(App 端,任意 vue 页面)

import { openTerminalPage, writeTerminalPage, closeTerminalPage, isTerminalSupported } from '@/uni_modules/up-term'

if (isTerminalSupported()) {
  openTerminalPage({
    sessionType: 'custom',       // Android 本地 shell 请改为 'local'
    fontSize: 14,
    welcomeText: 'connecting...\r\n'
  }, (event) => {
    const value = (key) => typeof event.get === 'function' ? event.get(key) : event[key]
    const name = value('event')
    if (name === 'ready') {
      // 等待 ready 后再写入;这里是 custom 会话的远端输出示意
      writeTerminalPage('connected\r\n$ ')
    } else if (name === 'input') {
      // value('data') 为输入字节流(字符串形式),交给宿主传输层
    } else if (name === 'error') {
      console.error(value('message'))
    }
  })
}

// 用户点击“断开”时调用,而不是紧跟在异步 open 之后执行
function disconnect() {
  closeTerminalPage()
}

Android 页面顶部有关闭按钮、BACK 键可直接关闭;iOS/web 页面右上角 ✕ 关闭。v1 限制:同时仅一个终端页实例,重复打开触发 error 事件。

用法三:Web / 鸿蒙 NEXT

H5 使用 up-term-web 组件(easycom 自动注册,基于内置 xterm.js)。源码包含 APP-HARMONY 适配分支,但该分支的 DOM 执行上下文仍需在鸿蒙目标工程验收:

<template>
  <!-- #ifdef H5 || APP-HARMONY -->
  <view style="display:flex;flex-direction:column;height:100vh;">
    <up-term-web
      ref="term"
      style="flex:1;width:100%;"
      sessionType="custom"
      :fontSize="14"
      welcomeText="ready\r\n"
      @ready="onReady" @data="onData" @resize="" @error="onError">
    </up-term-web>
  </view>
  <!-- #endif -->
</template>

<script>
  export default {
    methods: {
      onData(e) {
        // e.data 为键盘输入 → 发往 WebSocket;远端输出 → this.$refs.term.write(data)
        this.$refs.term.write(e.data)   // 示例:直接回显
      }
    }
  }
</script>

Web 端也可以直接调函数 API:openTerminalPage 会创建全屏 overlay 终端(closeTerminalPage 关闭),事件契约与 App 端一致。

鸿蒙 NEXT 的全屏页(实验性):当前实现从 UTS 层导航到插件内置 vue 页面,并通过 uni 全局事件总线传递选项/事件。原生与页面事件桥、ArkWeb 终端渲染尚未真机验证。集成时需在宿主 pages.json 注册内置页:

{ "path": "uni_modules/up-term/pages/up-term-harmony-page", "style": { "navigationBarTitleText": "终端" } }

local 会话在 web/鸿蒙适配中返回明确 error;本插件未在这些端实现本地 shell。

v1 API(保持兼容)

import { isSupported, isTerminalSupported, getDeviceInfo, showToast } from '@/uni_modules/up-term'

isSupported():App-Android / App-iOS 为 true(v1 语义)。isTerminalSupported():Android / iOS / H5 / 鸿蒙为 true。

Android 会话实现说明

  • local:Termux TerminalSession(JNI pty)+ TerminalView,env 注入 PATH/HOME(应用 filesDir)/TERM=xterm-256color 等。
  • custom:真实 TerminalSession 运行 stty raw -echo; exec cat 回环进程——write() 经回环渲染到仿真器;键盘输入全部经 TerminalViewClient 钩子拦截转发 data 事件,无本地回显。

发布验证记录

完整命令、结果和未覆盖范围见仓库的 docs/release-validation-2.0.0.md。

  • 发布前 npm test 行为回归:32/32 通过(Web/演示 18、Harmony 12、小程序降级 2)。Harmony 测试使用宿主 API 边界替身,不是原生联调。
  • npm run type-check:通过。
  • npm run build:h5:通过,type-only 导入警告已修正。
  • H5 生产包浏览器交互:全屏页打开、ready 尺寸回调、输入事件及关闭清理通过。

下方清单是集成方需要执行的设备验收步骤,不代表本轮已执行。

设备与集成验收清单

Android(自定义基座)

  1. examples/terminal.nvue:sessionType=local → ls、top、echo $PATH 交互正常;@resize 触发。
  2. examples/terminal-page.vue:全屏终端;✕ 与 BACK 关闭;custom 模式输入事件与 write() 渲染(含 ANSI 颜色)正常。
  3. v1 API 正常。

iOS(自定义基座,Xcode 16 镜像)

  1. terminal.nvue:custom + WebSocket(WebSSH) 输入输出闭环;local 触发 @error。
  2. 全屏页 custom 会话正常。
  3. v1 API 正常。

H5

  1. npm run dev:h5 打开 examples/web-terminal.vue:键入回显、窗口缩放触发 @resize。
  2. terminal-page.vue:openTerminalPage 全屏 overlay、✕ 关闭、writeTerminalPage 渲染正常。
  3. isTerminalSupported() 为 true;getDeviceInfo() 安全降级。

鸿蒙 NEXT(真机/模拟器)

  1. uni-app 鸿蒙工程引入插件,并在 pages.json 注册内置页 uni_modules/up-term/pages/up-term-harmony-page。
  2. 打开 web-terminal.vue 页面:ArkWeb 中 xterm.js 渲染与输入正常。
  3. terminal-page.vue:openTerminalPage(custom) 导航到内置终端页;input/resize/close 事件经事件总线回传宿主;writeTerminalPage 渲染正常。
  4. local 请求返回明确 error(预期行为)。

mp-weixin

  1. 所有终端 API 返回 supported: false,页面不崩溃。

已知限制

  • iOS / Web / 鸿蒙适配未提供本地 shell。iOS 普通沙箱应用不能用本插件启动系统 shell;不对鸿蒙其他原生运行环境的进程能力作通用结论。
  • Android/iOS/Harmony 的编译、软键盘/硬键盘、控制键、UTF-8、ANSI 往返、页面回收均需在设备上验证;结构检查不能证明这些功能可用。
  • 鸿蒙端全屏页依赖 uni.$emit/$on 跨层事件总线与内置页注册;若宿主未注册内置页,openTerminalPage 会通过 error 事件提示。
  • iOS 终端标题(title 事件)暂不上报;iOS 全屏页不跟随旋转重排(v1)。
  • custom 会话在 Android 5.x 可能因缺少 stty 出现行缓冲(建议 Android 6.0+)。
  • 组件/页面暂未暴露配色方案自定义(默认黑底白字)。
  • mp-weixin 不支持终端(xterm canvas 适配不在本版范围)。

许可声明

依赖来源、版本、AAR 校验摘要及上游授权说明见 THIRD_PARTY_NOTICES.md。

  • Termux terminal-emulator / terminal-view:Apache License 2.0(utssdk/app-android/libs/LICENSE-termux.txt)。
  • SwiftTerm:MIT License(utssdk/app-ios/LICENSE-SwiftTerm.txt)。
  • xterm.js:MIT License(libs/xterm/LICENSE-xterm.txt)。
  • addon-fit:MIT License(libs/xterm/LICENSE-addon-fit.txt)。

示例

拷贝 examples/ 下的页面到业务工程:

  • basic.vue:v1 API 验证页(vue)。
  • terminal.nvue:嵌入式终端组件页(nvue,Android local / 双端 custom)。
  • terminal-page.vue:全屏终端页示例(vue,App/H5 可用)。
  • web-terminal.vue:Web/鸿蒙终端组件示例(vue,H5/APP-HARMONY)。

隐私、权限声明

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

插件不主动申请运行时权限;Android 本地 shell 在应用沙箱权限内运行。远程连接及其权限由宿主配置。

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

仅在调用 getDeviceInfo 时读取设备与应用信息(iOS 包括 IDFV),返回给宿主应用;插件不主动上传这些信息。custom 会话数据由宿主配置的传输层处理。

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

none

许可协议

MIT协议

暂无用户评论。