uni.requirenativeplugin('xxx') 返回 undefined 的根本原因是原生插件未被识别或注册成功,需严格校验路径命名一致性、目录结构、package.json 存在性、manifest.json 配置及平台判断与空值校验。

直接调用 uni.requireNativePlugin 就行,但返回 undefined 是常态——不是你代码写错了,而是原生侧根本没被识别或注册成功。
为什么 uni.requireNativePlugin('xxx') 总是返回 undefined
这不是 JS 报错,而是插件加载链在某处断了。核心就两点:路径/命名没对齐,或原生侧压根没注册。
-
nativeplugins目录必须手动建在项目根目录下,名称大小写一个字母都不能错(不能是NativePlugins或native-plugins) - 插件子目录名(如
nativeplugins/bd-face-plugin/)、package.json里的"name"字段、JS 中传给uni.requireNativePlugin()的字符串,三者必须完全一致且区分大小写 - Android 插件的
.aar必须直接放在android/子目录下,不能嵌套进android/libs/;iOS 的.framework或源码必须放在ios/下 -
package.json是硬性要求,不能缺失,也不能放错位置(必须在插件子目录根下) -
manifest.json中app-plus → usingComponents必须为true,否则整个原生插件系统被禁用
调用前必须做平台判断和空值校验
在非 App 平台(H5、小程序)调用 uni.requireNativePlugin 永远返回 undefined,且不会抛错——靠 try/catch 捕获不到。
- 先用
uni.getSystemInfoSync().platform === 'app-plus'做运行时判断 -
uni.requireNativePlugin()返回的是普通对象,不是Promise,也不支持await - 插件加载有延迟,首次调用可能返回
null,必须加空值校验:if (!facePlugin) { uni.showToast({ title: '插件未就绪', icon: 'none' }); return; } - 建议把插件实例挂到
Vue.prototype或globalThis上复用,避免重复调用requireNativePlugin
权限与初始化不能只靠 manifest.json
manifest.json 里勾选“相机”只是声明权限,真机上不等于能用。插件内部若需要访问硬件,必须走运行时流程。
- Android:必须手动调用
uni.authorize({ scope: 'scope.camera' }),且要在getSystemInfo确认platform后再请求;部分厂商(华为、小米)还需额外处理后台白名单 - iOS:除了
manifest.json,Xcode 工程的Info.plist必须手动添加NSCameraUsageDescription键,值为用户可见的用途说明
最常被忽略的一点:插件是否真正生效,不能看 HBuilderX 插件管理页显示“已安装”,而要看真机运行时 console.log(uni.requireNativePlugin('YourPluginName')) 是否返回一个带方法的对象;如果还是 undefined,说明原生侧配置还没跑通,别急着写业务逻辑。











