uni-app中createrewardedvideoad报“not a function”是因为该api仅微信/qq小程序支持,h5、app等端不支持,需先判断平台并用uni.getprovider校验广告能力。

uni-app 里调用 createRewardedVideoAd 报错 “not a function”
这是因为 H5 端根本不支持微信广告 API,而你可能在非微信环境(比如浏览器调试、App 端、支付宝小程序)里直接写了微信专属方法。uni-app 的广告 API 是平台隔离的,createRewardedVideoAd 只在「微信小程序」和「QQ 小程序」可用,其他端要么返回 undefined,要么直接报错。
实操建议:
- 务必先判断运行环境:
uni.getSystemInfoSync().platform === 'devtools'(H5)、uni.getSystemInfoSync().platform === 'app-plus'(App)都不该走微信广告逻辑 - 用
uni.getProvider检查当前平台是否支持广告:例如uni.getProvider({service: 'ad', success: ...}),只在回调成功时初始化广告实例 - 微信小程序需在
manifest.json中正确配置mp-weixin的appid,否则广告组件会静默失效
App 端接入穿山甲 / 广点通 SDK 后没展示,但控制台无报错
App 端广告不是靠 JS 调用就能生效的,必须原生层集成 SDK。uni-app 的 ad 组件在 App 端只是壳,背后依赖的是 uni-app 插件市场 里的原生插件(如“DCloud 穿山甲广告插件”或“腾讯优量汇插件”),JS 层调用只是触发原生桥接。
实操建议:
- 确认已从
https://ext.dcloud.net.cn/下载对应广告平台的原生插件,并按说明放入nativePlugins/目录,且在manifest.json → App 模块配置中勾选启用 - Android 需检查
android/app/src/main/AndroidManifest.xml是否补全了广告平台要求的权限和 provider 声明(比如穿山甲的com.bytedance.sdk.openadsdk.TToastActivity) - iOS 需在
ios/Podfile或 Xcode 工程中确认 SDK 版本兼容性——例如优量汇 4.7+ 要求 iOS 11.0+,低于此版本会静默不加载
ad 组件在微信小程序里显示空白,onLoad 和 onError 都没触发
大概率是广告位 ID(adpid)未通过微信流量主审核,或填写错误。微信对广告位管控极严:未过审的 adpid 不会触发任何生命周期回调,组件直接渲染为空白 DOM,也不抛异常。
实操建议:
- 登录
mp.weixin.qq.com→ 流量主 → 广告位管理,确认该adpid状态为「审核通过」,且绑定的小程序 AppID 与当前项目一致 - 真机调试时用微信开发者工具「真机调试」功能,禁用「压缩代码」选项,否则部分广告回调会被混淆丢弃
- 不要在
v-if中控制ad组件显隐——微信限制广告组件必须挂载后才能加载,应改用v-show或动态设置style="display: none"
多个广告位混用时,load() 失败率高,用户反馈卡顿
广告 SDK 对并发请求敏感,尤其激励视频类广告,频繁调用 load() 会触发平台限流,甚至被判定为异常行为。uni-app 默认不缓存广告实例,每次调用都新建请求,容易超限。
实操建议:
- 每个广告位类型(激励视频、Banner、插屏)单独持有一个实例,复用而非重复创建;例如把
rewardedVideoAd实例挂到Vue.prototype或 Pinia store 中 - 在
onLoad回调里立即调用下一次load(),实现预加载(但注意别在onError后立刻重试,要加防抖,比如延迟 3s) - App 端若同时接入穿山甲 + 优量汇,避免在同一页面混用两家的 Banner,它们的底层 WebView 渲染策略冲突,会导致布局抖动或白屏
广告加载时机、平台能力边界、原生插件状态——这三个地方一旦没对齐,问题就既不报错也不提示,只能靠日志和真机反复验证。别信“写完就能跑”,得一层层确认链路是否真实打通。










