请输入
菜单

原生(模板)广告接入及API说明

原生广告接入代码

1. 原生广告介绍

原生广告是在列表页或轮播图上显示的广告类型,目前原生广告仅支持模版渲染。

2. 原生广告集成说明

  1. 原生对象可以重复请求,广告请求成功后,媒体自行存储 NativeAdWrapper 对象数组,如果未存储,重新 loadAd 后,上一个 NativeAdWrapper 对象数组会被移除;
  2. 原生重复拉取过多后。媒体可根据自身情况手动进行移除,防止内存占用过大。
  3. 在 build 方法中添加 AMPSBuildNativeView({ nativeWrapper: NativeAdWrapper}),进行显示。

3. 原生广告 API 说明

3.1.1 AMPSNativeAd 说明

方法 说明
constructor(uiContext:UIContext,,option: ampsAd.AdOptions, callBack: INativeAdListener) 构造方法创建广告对象,uiContext,option 参数配置,callBack:回调方法集
loadAd 广告请求

3.1.2 ampsAd.AdOptions 参数

属性 说明
spaceId 广告位 ID
apiKey 商户 ID
timeoutInterval 拉取广告超时时间
adCount 请求广告数量
s2sImpl S2S传入的bidToken
expressSize 广告宽高,单位 vp

3.1.3 AMPSNativeAdListener 回调接口说明

方法 说明
loadOk: (adItems: Array) => void 原生广告加载成功
loadFail: (code: number, message: string) => void 原生广告加载失败

3.2 AMPSNativeAdWrapper 属性方法说明

属性或方法 说明
renderCallBack?: INativeRenderListener 广告渲染数据是否准备成功回调接口
expressCallBack?: INativeExpressListener 广告显示相关回调接口
interactCallBack?: INativeInteractiveListener 广告交互相关回调接口
renderAd() 调用此方法开始准备渲染数据
getECPM 获取竞价
notifyRTBWin 竞价成功上报
notifyRTBLoss 竞价失败上报

3.2.1 AMPSNativeRenderListener 接口说明

回调方法 说明
renderSuccess: (adWrapper: AMPSNativeAdWrapper) => void 广告渲染数据准备成功时回调
renderFailed: (adWrapper: AMPSNativeAdWrapper) => void 广告渲染数据准备失败时回调

3.2.2 AMPSNativeInteractiveListener 接口说明

回调方法 说明
onAdShown: (bidId?: string) => void 原生广告视图显示
onAdExposure: (bidId?: string) => void 原生广告视图曝光
onAdClicked: (bidId?: string) => void 原生广告视图点击
toCloseAd: (bidId?: string) => void 原生广告视图关闭

4. 原生广告代码示例

广告加载与显示:

TypeScript 复制代码
import { AMPSNativeAdView, ampsAd, AMPSNativeAd, AMPSNativeAdWrapper } from 'biz.beizi.adn';
import { AMPSNativeAdListener, AMPSNativeInteractiveListener, AMPSNativeExpressListener, AMPSNativeRenderListener } from 'biz.beizi.adn';

import { promptAction, router } from '@kit.ArkUI';
import { apiKey } from '../entryability/EntryAbility';
import { ParamModel } from './SplashPage';


@Entry
@Component
struct NativeAdPage {
  arr: string[] =
    ["element-1", "element-2", "element-3", "element-4", "element-5",
      "element-6", "element-7", "element-8", "element-9", "element-10"]
  @State adItems: Item[] = []
  @State listHeight: number = 120
  @State heightMap: Map<string, number> = new Map()

  private mRenderCallback:AMPSNativeRenderListener ={
    renderSuccess:(adWrapper: AMPSNativeAdWrapper)=>{
      adWrapper.interactCallBack = this.mInterCallback
      adWrapper.expressCallBack = this.expressCallBack
      this.heightMap.set(adWrapper.adId, 202)
      setTimeout(()=>{
        let ad = new AdItem(adWrapper)
        this.adItems.splice(2,0,ad)
      },10)
    },
    renderFailed: (adWrapper: AMPSNativeAdWrapper)=>{
      console.log("onAdShown:" + adWrapper.adId)
    }
  }
  private expressCallBack: AMPSNativeExpressListener = {
    onAdShown: (adId?: string): void => {
      console.log("onAdShown:" + adId)
    },
    onAdExposure: (adId?: string): void => {
      console.log("onAdExposure" + adId)
    }
  }
  private mInterCallback: AMPSNativeInteractiveListener = {
    onAdClicked: (adId?: string): void => {
      console.log("客户端onAdClicked:" + adId)
    },
    toCloseAd: (adId?: string): void => {
      let index = -1;
      for (let i = 0; i < this.adItems.length; i++) {
        if (!(this.adItems[i] instanceof AdItem)) {
          continue;
        }
        let ad = this.adItems[i] as AdItem;
        if (ad.wrapper.adId == adId) {
          index = i;
        }

      }
      if (index >= 0) {
        this.adItems.splice(index, 1);
      }
    },
    onOpenLandingPage: (adId?: string | undefined): void => {
      console.log("onOpenLandingPage:" + adId)
    },
    onCloseLandingPage: (adId?: string): void => {
      console.log("onCloseLandingPage:" + adId)
    }
  }
  private callback: AMPSNativeAdListener = {
    loadOk: (adItems: AMPSNativeAdWrapper[]): void => {
      for (let adItemsElement of adItems) {
        adItemsElement.renderCallBack = this.mRenderCallback
        //adItemsElement.option.mExpressSize = [300,400]
        adItemsElement.renderAd()
      }
    },
    loadFail: (code: number, message: string): void => {
      promptAction.showToast({ message })
    }
  }

  aboutToAppear(): void {
    for (let i = 0; i < this.arr.length; i++) {
      let o = new Item()
      o.index = i
      o.message = this.arr[i]
      this.adItems.push(o)
    }
    let option: ampsAd.AdOptions = {
      apiKey: apiKey,
      spaceId: '15295',
      adCount: 1,
      expressSize:[px2vp(display.getDefaultDisplaySync().width),200]
    }
    let map:ParamModel= router.getParams() as ParamModel
    option.spaceId = map.spaceId
    //SDK外部调用加载广告
    new AMPSNativeAd(option, this.callback)
      .load()
  }

  build() {
    Column() {
      List() {
        ForEach(this.adItems, (item: Item, index) => {
          ListItem() {
            Column() {
              if (item instanceof AdItem) {
                Column() {
                  AMPSBuildNativeView({ nativeWrapper: item.wrapper })
                }
              } else {
                Text(`第${item.index + 1}条=${item.message}`)
                  .height("120")
                  .width("100%")
                  .backgroundColor(Color.Blue)
                  .margin(10)
                  .textAlign(TextAlign.Center)
              }
            }.width("100%")
          }
        })
      }
    }
    .width('100%')
    .height("100%")

  }
}

class Item {
  index: number = 0
  message: string = ''
}

class AdItem extends Item {
  wrapper: AMPSNativeAdWrapper
  suggestHeight = 200

  constructor(aWrapper: AMPSNativeAdWrapper) {
    super()
    this.wrapper = aWrapper
  }
}

5. 原生广告注意事项

  • 需要在 onAdClicked 回调用方法中,处理数据源,关闭广告。
  • 原生广告高度可自适应,效果最优。
上一个
插屏广告接入及API说明
下一个
新原生(模板/自渲染)广告接入及API说明
最近修改: 2025-06-10