UTS插件需先通过uni.registerPlugin注册,再用uni.requireNativePlugin获取实例调用;必须使用@Component类和@Consume方法导出,参数限基础类型;Android/iOS线程模型不同,需注意UI操作线程切换;每次修改须重新编译原生工程。

UTS 插件不能直接在 Vue 页面里 import 使用,必须通过 uni.registerPlugin 注册后,用 uni.requireNativePlugin 拿到实例再调用——这是最常卡住的地方。
UTS 插件怎么注册和调用才有效
UTS 插件不是普通 JS 模块,它运行在原生层,Vue 侧无法直接访问。必须走 uni-app 提供的桥接机制。
- 插件包名(如
uni-plugin-demo)要和uts.json中的"id"完全一致,大小写敏感 - 注册必须在
App.vue的onLaunch或页面onLoad早期执行,晚了可能触发undefined is not an object - 调用前必须先
uni.registerPlugin('uni-plugin-demo'),否则uni.requireNativePlugin返回null - 正确调用方式:
const plugin = uni.requireNativePlugin('uni-plugin-demo'); plugin.doSomething()
UTS 文件里 export 的函数为什么 Vue 侧调不到
UTS 不支持默认导出或命名导出语法;所有可被调用的方法必须显式声明为 @Consume 或 @Provider,且仅限 class 内部方法。
- 错误写法:
export function foo() {}—— 这在 UTS 中不生效,也不会暴露给 JS 层 - 正确写法:定义一个 class,方法加
@Consume装饰器,类本身用@Component标记 - UTS 类名会作为插件的“能力名”,比如
class DemoService,调用时就是plugin.DemoService.doSomething() - 参数类型只能是基础类型(
string、number、boolean、Array、Map),传function或Promise会静默失败
Android/iOS 行为不一致,或者调试时没反应
UTS 插件编译后生成的是平台专属的原生代码,Android 和 iOS 的实现逻辑、生命周期、线程模型完全不同。
- iOS 端 UTS 方法默认在主线程执行,Android 默认在子线程 —— 如果操作 UI(比如弹 Toast),Android 必须手动切回主线程,iOS 反而可能因阻塞主线程卡顿
- 调试时建议优先看 Xcode 控制台或 Android Logcat,而不是 HBuilderX 的控制台,JS 层报错往往只是“调用失败”,真正原因在原生日志里
-
uts.json中的"platforms"字段必须明确列出目标平台,漏掉"ios"或"android"会导致对应平台完全不打包该插件 - 真机调试必须关闭“自定义基座”以外的热重载,否则 UTS 修改不会实时生效,容易误判逻辑问题
UTS 最容易被忽略的点是:它没有“热更新”概念,每次改完都要重新编译原生工程。哪怕只改了一行 console.log,也得等 Gradle/Xcode 构建完才能验证——这不是开发流程慢,是原生集成的本质决定的。

















