更新记录
1.3.2(2026-09-09) 下载此版本
删除无用文件,减少代码体积
1.3.1(2026-09-08) 下载此版本
更新开屏功能,优化加载过程
1.3.0(2026-08-13) 下载此版本
增加负反馈功能
查看更多平台兼容性
uni-app(4.85)
| Vue2 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|
| - | √ | 1.0.0 | - | - | - | - | - | - | - |
| 微信小程序 | 微信小程序插件版本 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3.15.0 | 1.0.0 | - | - | - | - | - | - | - | - | - | - | - |
# WL-Track 广告组件使用文档
一个简单易用的 uniapp 广告组件库,按广告类型提供独立组件标签,自动拉取数据、渲染与埋点。
组件列表
| 标签 | 广告类型 | 说明 |
|---|---|---|
wl-splash-ad |
开屏 | 图片开屏;视频素材自动走插屏样式 |
wl-banner-ad |
Banner | 单图横幅或视频横幅 |
wl-carousel-ad |
轮播 | 多图轮播 |
🚀 快速对接
一、初始化埋点 SDK(必需)
在 App.vue 中初始化平台对应的埋点 SDK,并挂载到全局:
<!-- App.vue -->
<script setup lang="ts">
// #ifdef MP-WEIXIN
import { wlydTrack } from '@wlydfe/track-js'
// 初始化微信小程序埋点
wlydTrack.init({
isProd: false, // 是否生产环境
debug: true, // 是否开启调试
autoTrack: true, // 是否自动埋点
trackerType: 'quick_tracking_wx', // 埋点类型
config: {
project: 'your_project_id', // qt应用key
serverUrl: 'https://your-server-url.com', // 收数服务器地址
},
})
// #endif
// #ifdef APP-PLUS
import * as QtAnalytics from '@/uni_modules/QT-Analytics'
const platform = uni.getSystemInfoSync().platform
// 根据不同平台初始化
if (platform === 'android') {
QtAnalytics.init()
} else if (platform === 'ios') {
QtAnalytics.setCustomDomain('https://your-server-url.com')
QtAnalytics.initWithAppkey('your_app_key')
QtAnalytics.setLogEnabled(true)
} else if (platform === 'harmony') {
QtAnalytics.init()
}
// #endif
</script>
二、初始化广告 SDK(必需)
在完成埋点 SDK 初始化后,初始化广告 SDK:
<!-- App.vue(续) -->
<script setup lang="ts">
import { initGlobalAdSDK } from '@/uni_modules/wl-track/utils/ad-sdk'
onLaunch(() => {
// 初始化广告 SDK
initGlobalAdSDK({
app_key: 'your_app_key', // 替换为实际的应用Key(必填)
// webviewPath: '/subs/common/web-view/index?url=${jumpAdUrl}',
// #ifdef MP-WEIXIN
wlydTrack: wlydTrack, // 微信小程序埋点实例(必填)
// #endif
// #ifdef APP-PLUS
QtAnalytics: QtAnalytics, // APP 埋点实例(必填)
// #endif
})
})
</script>
⚠️ 重要提示:
- 必须先初始化埋点 SDK,再初始化广告 SDK
- 微信小程序需要安装
@wlydfe/track-js依赖- APP 需要集成
QT-Analytics插件- 微信小程序必须传入
wlydTrack参数,否则会报错- APP 必须传入
QtAnalytics参数,否则会报错
webview 承接页(可选)
广告点击后默认打开插件内置承接页。业务方使用自己的 webview 页时,在初始化传入 webviewPath:
// 业务自定义模板(含占位符)
initGlobalAdSDK({
appKey: 'your_app_key',
webviewPath: '/subs/common/web-view/index?url=${jumpAdUrl}',
})
// 不传 webviewPath:使用插件默认页,自动拼接 ?url=
initGlobalAdSDK({ appKey: 'your_app_key' })
业务模板中的 ${jumpAdUrl} / ${url} 会替换为编码后的落地链接;未配置时使用插件默认承接页并拼接 ?url=。
微信小程序:承接页建议注册为分包(见
pages_init.json的subPackages),避免主包uni_modules页面被「代码依赖分析」忽略。跳转路径仍为/uni_modules/wl-track/pages/landing/index。
三、使用组件
方式一:Easycom 自动导入(推荐,已配置)
项目已在 pages.config.ts 中配置 easycom,所有页面可直接使用各广告组件,无需 import:
// pages.config.ts
easycom: {
custom: {
'^wl-(splash|banner|carousel)-ad$':
'@/uni_modules/wl-track/components/wl-$1-ad.vue',
},
}
直接在页面中使用(按广告位类型选择对应标签):
<template>
<view class="page">
<!-- 开屏广告 -->
<wl-splash-ad ad-slot-key="549" />
<!-- Banner 广告 -->
<wl-banner-ad ad-slot-key="550" />
<!-- 轮播广告 -->
<wl-carousel-ad ad-slot-key="551" />
</view>
</template>
💡 注意:每种标签对应一种广告类型,请根据广告位类型选择正确组件;类型不匹配时会报错提示。
组件会自动:
- ✅ 获取广告数据
- ✅ 渲染对应类型的广告
- ✅ 处理加载/错误状态
- ✅ 上报埋点数据(请求、响应、曝光、点击、播放等)
💡 埋点会根据平台自动使用对应的 SDK(微信小程序用 wlydTrack,APP 用 QtAnalytics)
📱 使用示例
基础用法
开屏广告
<template>
<wl-splash-ad
ad-slot-key="549"
:countdown-seconds="5"
/>
</template>
🎯 常用配置
事件监听
<template>
<wl-splash-ad
ad-slot-key="549"
@ad-layer-close="onAdLayerClose"
@close="onClose"
@click="onClick"
@error="onError"
/>
</template>
<script setup lang="ts">
const onAdLayerClose = (type: 'skip' | 'click' | 'auto') => console.log('广告层即将关闭', type)
const onClose = (type: 'skip' | 'click' | 'auto') => console.log('广告关闭', type)
const onClick = (adData) => console.log('广告点击', adData)
const onError = (error) => console.error('加载失败', error)
</script>
🔧 组件参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
ad-slot-key |
string |
✅ | - | 广告位标识 |
name |
string |
❌ | - | 预取缓存唯一标识;同一广告位多次预取时用于区分 |
auto-fetch |
boolean |
❌ | true |
是否组件内自动请求;页面/业务侧先请求时传 false |
ad-data |
AdData |
❌ | - | 业务侧已通过 loadAd 等方式获取的广告数据(配合 auto-fetch=false 与 v-if 使用) |
ad-data-json |
string |
❌ | - | 广告数据 JSON 字符串(小程序端 :ad-data 对象传参异常时的备选) |
feedback-style |
CSSProperties |
❌ | {} |
广告负反馈蒙层自定义样式(如 { backgroundColor: 'rgba(0,0,0,0.5)' }) |
ad-tag-position |
'tl'\|'tr'\|'bl'\|'br' |
❌ | bl |
广告标四角位置 |
ad-tag-style |
CSSProperties |
❌ | {} |
广告标自定义样式(可覆盖 top/left/right/bottom) |
close-position |
'tl'\|'tr'\|'bl'\|'br' |
❌ | tr |
关闭按钮四角位置(仅 neFeedbackType=11) |
close-style |
CSSProperties |
❌ | {} |
关闭按钮自定义样式(仅 neFeedbackType=11) |
before-jump |
Function |
❌ | - | 自定义跳转时机拦截。(context: BeforeJumpContext, proceed: () => void) => void |
image-url |
string |
❌ | - | Banner图片直传地址(针对图片横幅必填) |
countdown-seconds |
number |
❌ | 5 |
倒计时秒数(开屏广告) |
auto-show |
boolean |
❌ | true |
是否自动展示(开屏广告) |
height |
number \| string |
❌ | - | 轮播高度(rpx,仅轮播组件) |
自定义跳转时机拦截 (
before-jump)所有广告组件均已支持:
wl-splash-ad/wl-banner-ad/wl-carousel-ad/wl-feed-ad/wl-interstitial-ad。默认点击素材区会立即新开落地页。若业务需在跳转前执行自己的逻辑(如弹窗确认、登录校验),可配置
:before-jump属性:const handleBeforeJump = (context, proceed) => { // context.adData 为当前广告数据 // context.index:Banner / 开屏 / 信息流 / 插屏为 0,轮播为当前帧索引 doYourLogic().then(() => { proceed(); // 准备好后再跳转 }); // 不调用 proceed() 则不会跳转 }
- 未配置
beforeJump:行为与原来一致,点击后立即跳转- 已配置
beforeJump:SDK 不会自动跳转,需业务在合适时机调用proceed()@click事件仍会在点击时触发(用于通知),与跳转时机无关- 开屏 / 插屏额外行为:进入
beforeJump时会暂停倒计时;业务调用proceed()后会从完整秒数重新倒计时,再执行跳转。不调用proceed()则倒计时保持暂停(仍可点「跳过/关闭」)
开屏广告(wl-splash-ad)overlay 样式
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
skip-button-style |
CSSProperties |
{} |
跳过按钮样式 |
ad-tag-style |
CSSProperties |
{} |
广告标样式 |
默认布局:左上角一行 [广告] [跳过 5s](两个独立元素)。如需改位置,分别给两个 style 传入 top、left、right、bottom 即可,组件会自动清理冲突边(无需手写 auto)。
<!-- 默认 -->
<wl-splash-ad ad-slot-key="549" />
<!-- 自定义:跳过放右上,广告标放左下 -->
<wl-splash-ad
ad-slot-key="549"
:skip-button-style="{ top: '80px', right: '40rpx' }"
:ad-tag-style="{ bottom: '40rpx', left: '40rpx' }"
/>
📡 组件事件
各广告组件均支持以下事件,可用于监听广告生命周期并在业务侧做相应处理:
| 事件 | 回调参数 | 说明 |
|---|---|---|
@close |
- | 广告关闭时触发(含负反馈提交后关闭);业务侧可在此销毁广告组件 |
@click |
adData |
用户点击广告素材时触发 |
@load |
adData |
广告素材加载/渲染成功时触发 |
@error |
error |
请求失败、数据解析失败或素材加载失败时触发 |
@request |
params |
发起广告请求前触发,params 为请求参数(含 adSlotKey) |
@response |
adData \| null |
广告请求返回时触发;失败时为 null |
@play |
adData |
视频开始播放时触发(视频类素材) |
@ended |
adData |
视频播放结束时触发(视频类素材) |
开屏特有:
| 事件 | 回调参数 | 说明 |
|---|---|---|
@adLayerClose |
type: 'skip' \| 'click' \| 'auto' |
广告层即将收起时触发,早于 @close,便于业务在真正关闭前处理逻辑 |
预取模式(所有广告组件均支持):
| 事件 | 回调参数 | 说明 |
|---|---|---|
@prefetchConsumed |
{ adSlotKey, name? } |
广告展示后消费预取缓存时触发 |
开屏关闭事件顺序:
| 场景 | 事件顺序 |
|---|---|
| 跳过 | adLayerClose(skip) → close(skip) |
| 倒计时结束 | adLayerClose(auto) → close(auto) |
| 点击广告(有 WebView) | click → adLayerClose(click) → close(click) |
轮播特有:
| 事件 | 回调参数 | 说明 |
|---|---|---|
@change |
current |
轮播切换时触发,current 为当前页索引(从 0 开始) |
<wl-splash-ad
ad-slot-key="549"
@ad-layer-close="onAdLayerClose"
@close="onClose"
@click="onClick"
@load="onLoad"
@error="onError"
@request="onRequest"
@response="onResponse"
/>
组件内部已自动上报埋点(请求、曝光、点击、关闭等),业务侧监听事件主要用于 UI 联动或自定义逻辑,无需重复上报。
负反馈(屏蔽广告)功能
SDK 原生支持广告“负反馈”功能,允许用户点击广告角标主动屏蔽当前不喜欢的广告。
开启与配置
当 API 接口下发的广告数据满足以下字段时,wl-banner-ad / wl-carousel-ad 会开启负反馈:
| 字段 | 类型 | 说明 |
|---|---|---|
neFeedbackType |
string |
10:无负反馈;11:底部提交面板;12:广告标气泡点选 |
neFeedback |
NeFeedbackItemDTO[] |
负反馈选项列表(11 / 12 时有内容) |
neFeedback 每一项(NeFeedbackItemDTO):
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
code |
string |
负反馈类型标识 | irrelevant / repeated / not_interested / poor_content / other |
name |
string |
展示文案 | 与我无关 / 重复收到多次 / 不感兴趣 / 内容太差 / 其他 |
两种 UI 模式:
neFeedbackType |
入口 | 交互 |
|---|---|---|
11 |
广告标(默认左下)+ 独立关闭按钮 ×(默认右上) | 点关闭按钮打开底部面板:选原因 → 可填补充说明 → 提交 |
12 |
广告标旁显示 ▼(默认左下,可改四角) |
气泡选项:点选某一项即提交并关闭 |
位置可分别配置:
<wl-banner-ad
ad-tag-position="bl"
:ad-tag-style="{ bottom: '24rpx', left: '24rpx' }"
close-position="tr"
:close-style="{ top: '24rpx', right: '24rpx' }"
/>
- 选项来源: 优先使用接口
neFeedback;若开启但列表为空,回退默认五项 - 关闭回调: 用户提交负反馈后,SDK 会先通过内部
v-if销毁广告展示,再触发@close(无额外参数)。业务侧监听@close后清空adData/ 关掉外层v-if即可。选择结果仅用于内部埋点,不抛给业务。
事件监听
<template>
<wl-banner-ad
v-if="adData"
:ad-slot-key="slotId"
:ad-data="adData"
:auto-fetch="false"
@close="handleClose"
/>
</template>
<script setup>
const adData = ref(null)
const handleClose = () => {
// 负反馈提交后也会走到这里,销毁组件即可
adData.value = null
}
</script>
注意: 负反馈选择结果不会抛给业务侧;底层仍会做 QT 埋点上报(
ad_feedback_show/ad_feedback_submit/ad_feedback_cancel)。公共参数与其它广告埋点一致:position_key、request_id、ads;提交时额外带feedback_reason、feedback_text。
支持哪些广告类型?
每种广告类型对应独立组件标签,请在页面中显式选用:
- 开屏广告 →
wl-splash-ad - Banner 广告 →
wl-banner-ad - 轮播广告 →
wl-carousel-ad - 信息流广告 →
wl-feed-ad - 插屏广告 →
wl-interstitial-ad
先请求后加载(预取模式)
推荐分工
| 广告类型 | 推荐方式 | 原因 |
|---|---|---|
| 开屏(启动尽早) | sdk.prefetch + loadFromPrefetch |
组件挂载前完成 JSON/素材预取,首屏 0ms 展示概率更高 |
| 开屏(常规) | wl-splash-ad + :auto-fetch="true" |
与预请求共用 prefetchAd 管道(validateAd、cache_status、竞态展示) |
| Banner / 轮播 / 信息流 / 插屏 | sdk.loadAd + :ad-data + :auto-fetch="false" |
业务先拿结果,再决定是否插入列表/轮播节点 |
非开屏推荐:sdk.loadAd
import { getGlobalAdSDK } from '@/uni_modules/wl-track/utils/ad-sdk'
const result = await getGlobalAdSDK()?.loadAd({
adSlotKey: 'banner_home_top'
})
if (result.hasAd) {
swiperItems.push({
type: 'ad',
adData: result.data,
})
}
<wl-banner-ad
v-if="item.type === 'ad'"
:ad-slot-key="item.adSlotKey"
:ad-data="item.adData"
:auto-fetch="false"
/>
要点:
loadAd返回hasAd=true后再挂载组件(v-if),通过:ad-data传入数据即可,无需 ref 调用。
LoadAdResult 结构:
interface LoadAdResult {
hasAd: boolean
data: AdData | null
reason?: 'no_fill' | 'not_renderable' | 'network_error' | 'sdk_not_ready' | 'invalid_params' | 'unknown'
error?: unknown
requestId?: string
}
开屏:常规模式(autoFetch)
开屏组件在 :auto-fetch="true"(默认)时,内部不再调用 getFalco,而是与 sdk.prefetch 共用同一套 prefetchAd 管道:
- 本地 JSON 缓存 →
validateAd校验复用 - 无缓存或无效 →
requestAd(自动传cache_status+request_scene:cold_direct/refresh_next) - 拉取成功 → 写入预取缓存并后台下载 OSS 素材
- 展示层 → 500ms 竞态 / 弱网跳过 / 本地素材 0ms 展示
- 展示成功 → 清除当前缓存并后台预取下一条
<wl-splash-ad
:ad-slot-key="SLOT_KEY"
:auto-fetch="true"
:auto-show="true"
/>
若 App 启动非常早、希望在组件挂载前就完成预取,仍推荐在
onLaunch额外调用sdk.prefetch,与常规 autoFetch 共用同一adSlotKey+name缓存,不会重复请求(命中本地缓存后仅复用)。
开屏:预请求模式(sdk.prefetch + loadFromPrefetch)
import {
getGlobalAdSDK,
hasPrefetchedAd,
clearPrefetchedAd,
} from '@/uni_modules/wl-track/utils/ad-sdk'
const SLOT_KEY = 'your_ad_slot_key'
// 1. 预取(可传 name 区分同一广告位的多份缓存)
await getGlobalAdSDK()?.prefetch({ adSlotKey: SLOT_KEY, name: 'home_banner' })
// 2. 需要展示时再加载
const loaded = adRef.value?.loadFromPrefetch?.()
if (!loaded) {
// 无缓存,可降级为实时请求
await adRef.value?.fetchAd?.()
}
<template>
<wl-splash-ad
ref="splashRef"
:ad-slot-key="SLOT_KEY"
name="splash_launch"
:auto-fetch="false"
:auto-show="true"
@prefetch-consumed="onPrefetchConsumed"
/>
</template>
| 组件 ref 方法 | 说明 |
|---|---|
loadFromPrefetch() |
从本地预取缓存加载并渲染,成功返回 true |
hasPrefetch() |
检查当前 ad-slot-key + name 是否有预取缓存 |
fetchAd() |
组件内重新发起实时请求(无预取缓存时的降级方案) |
工具函数:hasPrefetchedAd(adSlotKey, name?)、clearPrefetchedAd(adSlotKey, name?)
注意:同一
adSlotKey多条预取必须传不同name,否则缓存会互相覆盖。预取请用await串行或独立name,不要用void forEach并发无 name 预取。非开屏广告请使用上文
sdk.loadAd+v-if+:ad-data传参,不要在文档流程中使用 ref 灌数据。
🔧 其他功能
设置用户 ID
import { getGlobalAdSDK } from '@/uni_modules/wl-track/utils/ad-sdk'
const sdk = getGlobalAdSDK()
if (sdk?.global) {
sdk.global.setGlobalProperty({
user: {
userId: 'user_123',
},
})
}
错误码
| 错误码 | 说明 |
|---|---|
| 1000 | 服务器内部错误 |
| 1001 | 参数错误 |
| 1002 | 广告位不存在或在运行中 |
| 1003 | 未匹配到广告 |

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 27
赞赏 0
下载 12581294
赞赏 1949
赞赏
京公网安备:11010802035340号