更新记录

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.jsonsubPackages),避免主包 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=falsev-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 传入 topleftrightbottom 即可,组件会自动清理冲突边(无需手写 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) clickadLayerClose(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_keyrequest_idads;提交时额外带 feedback_reasonfeedback_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_scenecold_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 未匹配到广告

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。