不能。uni-app 本身不提供 AR 能力,无 uni.startAR 等接口,需通过自定义原生插件(iOS 封装 ARKit、Android 接入 ARCore)实现,JS 层仅作控制,通信限于事件与简单 JSON。

uni-app 能不能直接调用 AR 功能?
不能。uni-app 本身不提供 AR 能力,uni 系列 API 中没有 uni.startAR 或类似接口——这是最常被误解的一点。它的跨端能力止步于 WebView 和原生容器基础层,AR 需要访问设备摄像头、传感器、3D 渲染管线(如 ARKit/ARCore),这些必须走原生插件路径。
所以你看到的“uni-app 做 AR”,本质是:H5 页面(或 Vue 页面)作为控制层 + 原生模块负责渲染和追踪 + 双向通信协调逻辑。
iOS 上怎么让 uni-app 调起 ARKit?
得写一个自定义原生插件,核心是封装 ARSCNView 或 ARSKView,并暴露给 JS 调用。uni-app 的 App 端(基于 iOS 原生 SDK)支持通过 uni.requireNativePlugin 加载自定义模块。
- 插件需继承
UNINativeModule,在invoke方法里启动ARSession - 必须手动处理权限:在
Info.plist添加NSCameraUsageDescription,否则ARSession启动失败且无明确报错 - JS 层调用时,不能传复杂对象(如 THREE.js 场景),只建议传配置项,例如:
{type: 'image', imageResource: 'static/ar-marker.png'} - 渲染结果无法直接“嵌入”
<view>,通常做法是全屏覆盖原生 AR 视图,再用uni.hideTabBar等隐藏干扰 UI 元素
Android 怎么对接 ARCore?
比 iOS 更麻烦:ARCore 不是系统级服务,依赖 Google Play Services,且不同厂商对底层 sensor 支持差异大。uni-app 打包后的 Android 工程(基于 DCloud SDK)默认不含 ARCore 依赖,必须手动接入。
- 在
nativeplugins/android目录下添加arcore-clientAAR,并在build.gradle中声明implementation 'com.google.ar:core:1.33.0' - 运行时检测是否支持:
ArCoreApk.getInstance().requestInstall(this, true),否则Session.create()会抛出UnsatisfiedLinkError或静默失败 - 不要试图在
onCreate就初始化 Session——必须等SurfaceView创建完成、且surfaceChanged后再调用session.setCameraTextureName,否则黑屏 - uni-app 的
plus.android.importClass('android.opengl.GLSurfaceView')不能替代 ARCore 的ArFragment,别走这条路
JS 和原生 AR 模块怎么传数据?
只能靠事件 + 简单 JSON,别想共享内存或引用对象。uni-app 的原生插件通信机制是异步消息队列,高频帧数据(如每秒 60 次位姿更新)必须节流或聚合发送。
- 原生侧用
this.invokeHandler主动回调 JS,例如:invokeHandler('onTrackUpdate', { position: [x,y,z], rotation: [qx,qy,qz,qw] }) - JS 侧监听:
const ar = uni.requireNativePlugin('MyARPlugin'); ar.addEventListener('onTrackUpdate', handler) - 禁止在回调里调用
uni.showToast等 UI API——可能触发线程冲突,改用postMessage切到主线程再操作 - 图片资源路径注意:Android 原生插件收不到
static/下的相对路径,要用plus.io.convertLocalFileSystemURL转成file:///协议
真正卡住人的,往往不是怎么画一个 3D 模型,而是相机画面和虚拟物体之间那几十毫秒的同步偏差、不同机型对光照估计的差异、还有用户一打开就拒绝权限后连错误提示都收不到——这些细节没埋点、不真机反复测,上线就是白屏加报错。