写点什么

鸿蒙 Ads Kit(广告服务)开发指南:流量变现与广告接入实践

  • 2025-05-26
    北京
  • 本文字数:8768 字

    阅读完需:约 29 分钟

鸿蒙 Ads Kit(广告服务)开发指南:流量变现与广告接入实践

一、Ads Kit 概述

HarmonyOS Ads Kit(广告服务)是华为为开发者提供的一站式流量变现解决方案,旨在帮助应用通过广告实现商业化收益。其核心优势包括:

  • 多场景覆盖:支持应用内横幅、插屏、激励视频、开屏等多种广告形式,适配手机、平板、智慧屏等多终端设备。

  • 精准投放:基于华为终端云服务的大数据能力,实现用户画像分析与广告精准匹配,提升广告转化率。

  • 简单集成:提供标准化 SDK 与开发文档,开发者可快速完成广告接入与功能调试。

  • 合规安全:严格遵循数据隐私保护法规(如 GDPR、《个人信息保护法》),保障用户数据安全与应用合规运营。


二、流量变现服务开发核心能力

(一)广告形式与场景适配


(二)广告加载与展示流程(代码示例)

1、接下来让我们简单封装一个广告 sdk,第一步首先定义一下广告 sdk 常量,大家根据自己的需求可以进行相应的扩展

/** * 广告常量定义 */export class AdConstants {  // 广告位ID常量(示例)  static readonly BANNER_AD_ID = 'test_banner_ad_slot_id';  static readonly INTERSTITIAL_AD_ID = 'test_interstitial_ad_slot_id';  static readonly REWARD_VIDEO_AD_ID = 'test_reward_video_ad_slot_id';  static readonly SPLASH_AD_ID = 'test_splash_ad_slot_id';    // 广告尺寸常量  static readonly BANNER_SIZE_320_50 = { width: 320, height: 50 };  static readonly BANNER_SIZE_300_250 = { width: 300, height: 250 };    // 广告位置常量  static readonly POSITION_TOP = 0;  static readonly POSITION_BOTTOM = 1;} 
复制代码

2、第二步定义广告 sdk 相关广告设置的配置,代码如下:

/** * 广告类型枚举 */export enum AdType {  BANNER = 'banner',         // 横幅广告  INTERSTITIAL = 'interstitial', // 插屏广告  REWARD_VIDEO = 'reward_video', // 激励视频广告  SPLASH = 'splash'          // 开屏广告}
/** * 广告位配置 */export interface AdSlotConfig { // 横幅广告配置 bannerSize?: { width: number; height: number }; bannerPosition?: number; refreshInterval?: number; // 插屏广告配置 interstitialSize?: { width: number; height: number }; // 激励视频配置 isCustomReward?: boolean; // 开屏广告配置 splashOrientation?: number; splashTimeout?: number;}
/** * 广告监听器接口 */export interface AdListener { onAdLoaded(ad: any): void; onAdFailed(error: AdError): void; onAdShown(): void; onAdClicked(): void; onAdClosed(): void; // 激励视频专用回调 onReward(reward: { name: string; amount: number }): void; onVideoComplete(): void;}
/** * 广告错误信息 */export interface AdError { errorCode: number; errorMsg: string;}
/** * 广告加载结果 */export interface AdResult { success: boolean; ad?: any; error?: AdError;}
复制代码

3、第三步则是定义广告 sdk 的管理类,代码如下:

import common from '@ohos.app.ability.common';import { BusinessError } from '@ohos.base';import { AdListener, AdResult, AdType, AdSlotConfig } from './AdInterface';import ads from '@ohos.ads';
/** * 广告SDK管理类 - 提供鸿蒙广告SDK的统一管理接口 */export class AdsManager { private static instance: AdsManager; private context: common.UIAbilityContext; private isInitialized: boolean = false;
private constructor(context: common.UIAbilityContext) { this.context = context; this.initAdsService(); }
/** * 获取广告管理器实例(单例模式) * @param context 应用上下文 * @returns AdsManager实例 */ public static getInstance(context: common.UIAbilityContext): AdsManager { if (!this.instance) { this.instance = new AdsManager(context); } return this.instance; }
/** * 初始化广告服务 */ private initAdsService(): void { ads.init(this.context).then(() => { console.info('AdsManager: 广告服务初始化成功'); this.isInitialized = true; }).catch((error: BusinessError) => { console.error(`AdsManager: 广告服务初始化失败,错误码: ${error.code},错误信息: ${error.message}`); }); }
/** * 加载广告 * @param adType 广告类型 * @param adSlotId 广告位ID * @param adConfig 广告配置 * @param listener 广告监听器 */ public loadAd(adType: AdType, adSlotId: string, adConfig: AdSlotConfig, listener: AdListener): void { if (!this.isInitialized) { console.error('AdsManager: 广告服务未初始化,无法加载广告'); listener.onAdFailed({ errorCode: 1001, errorMsg: '广告服务未初始化' }); return; }
switch (adType) { case AdType.BANNER: this.loadBannerAd(adSlotId, adConfig, listener); break; case AdType.INTERSTITIAL: this.loadInterstitialAd(adSlotId, adConfig, listener); break; case AdType.REWARD_VIDEO: this.loadRewardVideoAd(adSlotId, adConfig, listener); break; case AdType.SPLASH: this.loadSplashAd(adSlotId, adConfig, listener); break; default: console.error(`AdsManager: 不支持的广告类型: ${adType}`); listener.onAdFailed({ errorCode: 1002, errorMsg: '不支持的广告类型' }); } }
/** * 加载横幅广告 * @param adSlotId 广告位ID * @param adConfig 广告配置 * @param listener 广告监听器 */ private loadBannerAd(adSlotId: string, adConfig: AdSlotConfig, listener: AdListener): void { // 创建横幅广告请求 const bannerRequest = { adSlotId: adSlotId, size: adConfig.bannerSize || { width: 320, height: 50 }, position: adConfig.bannerPosition || ads.BannerPosition.BOTTOM, refreshInterval: adConfig.refreshInterval || 30 };
// 加载横幅广告 ads.createBannerAd(this.context, bannerRequest).then(bannerAd => { // 设置广告事件监听器 this.setAdListeners(bannerAd, listener); // 加载广告 bannerAd.load().then(() => { console.info('AdsManager: 横幅广告加载成功'); listener.onAdLoaded(bannerAd); }).catch((error: BusinessError) => { console.error(`AdsManager: 横幅广告加载失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }).catch((error: BusinessError) => { console.error(`AdsManager: 创建横幅广告失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }
/** * 加载插屏广告 * @param adSlotId 广告位ID * @param adConfig 广告配置 * @param listener 广告监听器 */ private loadInterstitialAd(adSlotId: string, adConfig: AdSlotConfig, listener: AdListener): void { // 创建插屏广告请求 const interstitialRequest = { adSlotId: adSlotId, size: adConfig.interstitialSize || { width: 600, height: 400 } };
// 加载插屏广告 ads.createInterstitialAd(this.context, interstitialRequest).then(interstitialAd => { // 设置广告事件监听器 this.setAdListeners(interstitialAd, listener); // 加载广告 interstitialAd.load().then(() => { console.info('AdsManager: 插屏广告加载成功'); listener.onAdLoaded(interstitialAd); }).catch((error: BusinessError) => { console.error(`AdsManager: 插屏广告加载失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }).catch((error: BusinessError) => { console.error(`AdsManager: 创建插屏广告失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }
/** * 加载激励视频广告 * @param adSlotId 广告位ID * @param adConfig 广告配置 * @param listener 广告监听器 */ private loadRewardVideoAd(adSlotId: string, adConfig: AdSlotConfig, listener: AdListener): void { // 创建激励视频广告请求 const rewardRequest = { adSlotId: adSlotId, isCustomReward: adConfig.isCustomReward || false };
// 加载激励视频广告 ads.createRewardAd(this.context, rewardRequest).then(rewardAd => { // 设置广告事件监听器 this.setRewardAdListeners(rewardAd, listener); // 加载广告 rewardAd.load().then(() => { console.info('AdsManager: 激励视频广告加载成功'); listener.onAdLoaded(rewardAd); }).catch((error: BusinessError) => { console.error(`AdsManager: 激励视频广告加载失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }).catch((error: BusinessError) => { console.error(`AdsManager: 创建激励视频广告失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }
/** * 加载开屏广告 * @param adSlotId 广告位ID * @param adConfig 广告配置 * @param listener 广告监听器 */ private loadSplashAd(adSlotId: string, adConfig: AdSlotConfig, listener: AdListener): void { // 创建开屏广告请求 const splashRequest = { adSlotId: adSlotId, orientation: adConfig.splashOrientation || ads.Orientation.PORTRAIT, timeout: adConfig.splashTimeout || 5000 };
// 加载开屏广告 ads.createSplashAd(this.context, splashRequest).then(splashAd => { // 设置广告事件监听器 this.setAdListeners(splashAd, listener); // 加载广告 splashAd.load().then(() => { console.info('AdsManager: 开屏广告加载成功'); listener.onAdLoaded(splashAd); }).catch((error: BusinessError) => { console.error(`AdsManager: 开屏广告加载失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }).catch((error: BusinessError) => { console.error(`AdsManager: 创建开屏广告失败,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }
/** * 设置通用广告监听器 * @param ad 广告实例 * @param listener 广告监听器 */ private setAdListeners(ad: any, listener: AdListener): void { // 广告展示事件 ad.on('show', () => { console.info('AdsManager: 广告展示'); listener.onAdShown(); });
// 广告点击事件 ad.on('click', () => { console.info('AdsManager: 广告被点击'); listener.onAdClicked(); });
// 广告关闭事件 ad.on('close', () => { console.info('AdsManager: 广告被关闭'); listener.onAdClosed(); });
// 广告错误事件 ad.on('error', (error: BusinessError) => { console.error(`AdsManager: 广告发生错误,错误码: ${error.code},错误信息: ${error.message}`); listener.onAdFailed({ errorCode: error.code, errorMsg: error.message }); }); }
/** * 设置激励视频广告监听器(包含奖励回调) * @param rewardAd 激励视频广告实例 * @param listener 广告监听器 */ private setRewardAdListeners(rewardAd: any, listener: AdListener): void { // 设置通用监听器 this.setAdListeners(rewardAd, listener);
// 奖励发放事件 rewardAd.on('reward', (reward: { name: string; amount: number }) => { console.info(`AdsManager: 激励视频奖励发放,奖励名称: ${reward.name},奖励数量: ${reward.amount}`); listener.onReward(reward); });
// 视频播放完成事件 rewardAd.on('complete', () => { console.info('AdsManager: 激励视频播放完成'); listener.onVideoComplete(); }); }
/** * 检查广告是否已加载 * @param ad 广告实例 * @returns 广告是否已加载 */ public isAdLoaded(ad: any): boolean { return ad && ad.isLoaded; }
/** * 展示广告 * @param ad 广告实例 */ public showAd(ad: any): void { if (this.isAdLoaded(ad)) { ad.show().catch((error: BusinessError) => { console.error(`AdsManager: 展示广告失败,错误码: ${error.code},错误信息: ${error.message}`); }); } else { console.error('AdsManager: 广告未加载,无法展示'); } }
/** * 销毁广告资源 * @param ad 广告实例 */ public destroyAd(ad: any): void { if (ad) { ad.destroy(); console.info('AdsManager: 广告资源已销毁'); } }}
复制代码

4、接下来我们在相应的 page 页面集成和使用:代码示例:

import { AdsManager } from '../sdk/AdsManager';import { AdType, AdConstants } from '../sdk/AdInterface';import common from '@ohos.app.ability.common';
@Entry@Componentstruct AdExamplePage { @State bannerAd: any = null; @State interstitialAd: any = null; @State rewardAd: any = null; @State adStatusText: string = '广告未加载'; private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; private adsManager: AdsManager = AdsManager.getInstance(this.context);
aboutToAppear() { // 初始化并加载广告 this.loadBannerAd(); this.loadInterstitialAd(); this.loadRewardVideoAd(); }
aboutToDisappear() { // 页面销毁时释放广告资源 if (this.bannerAd) { this.adsManager.destroyAd(this.bannerAd); } if (this.interstitialAd) { this.adsManager.destroyAd(this.interstitialAd); } if (this.rewardAd) { this.adsManager.destroyAd(this.rewardAd); } }
// 加载横幅广告 loadBannerAd() { const adConfig = { bannerSize: AdConstants.BANNER_SIZE_320_50, bannerPosition: 1 // 底部位置 }; this.adsManager.loadAd(AdType.BANNER, AdConstants.BANNER_AD_ID, adConfig, { onAdLoaded: (ad) => { this.bannerAd = ad; this.adStatusText = '横幅广告加载成功'; this.adsManager.showAd(ad); }, onAdFailed: (error) => { this.adStatusText = `横幅广告加载失败: ${error.errorMsg}`; }, onAdShown: () => { console.info('横幅广告已展示'); }, onAdClicked: () => { console.info('横幅广告被点击'); }, onAdClosed: () => { console.info('横幅广告被关闭'); }, onReward: () => { // 横幅广告无奖励回调 }, onVideoComplete: () => { // 横幅广告无视频回调 } }); }
// 加载插屏广告 loadInterstitialAd() { const adConfig = { interstitialSize: { width: 600, height: 400 } }; this.adsManager.loadAd(AdType.INTERSTITIAL, AdConstants.INTERSTITIAL_AD_ID, adConfig, { onAdLoaded: (ad) => { this.interstitialAd = ad; this.adStatusText = '插屏广告加载成功'; }, onAdFailed: (error) => { this.adStatusText = `插屏广告加载失败: ${error.errorMsg}`; }, onAdShown: () => { console.info('插屏广告已展示'); }, onAdClicked: () => { console.info('插屏广告被点击'); }, onAdClosed: () => { console.info('插屏广告被关闭'); }, onReward: () => { // 插屏广告无奖励回调 }, onVideoComplete: () => { // 插屏广告无视频回调 } }); }
// 加载激励视频广告 loadRewardVideoAd() { const adConfig = { isCustomReward: false }; this.adsManager.loadAd(AdType.REWARD_VIDEO, AdConstants.REWARD_VIDEO_AD_ID, adConfig, { onAdLoaded: (ad) => { this.rewardAd = ad; this.adStatusText = '激励视频广告加载成功'; }, onAdFailed: (error) => { this.adStatusText = `激励视频广告加载失败: ${error.errorMsg}`; }, onAdShown: () => { console.info('激励视频广告已展示'); }, onAdClicked: () => { console.info('激励视频广告被点击'); }, onAdClosed: () => { console.info('激励视频广告被关闭'); }, onReward: (reward) => { console.info(`获得奖励: ${reward.name} x ${reward.amount}`); AlertDialog.show({ message: `恭喜获得 ${reward.amount} 个${reward.name}!`, autoCancel: true }); }, onVideoComplete: () => { console.info('激励视频播放完成'); } }); }
// 显示插屏广告 showInterstitialAd() { if (this.adsManager.isAdLoaded(this.interstitialAd)) { this.adsManager.showAd(this.interstitialAd); } else { AlertDialog.show({ message: '插屏广告尚未加载完成', autoCancel: true }); } }
// 显示激励视频广告 showRewardVideoAd() { if (this.adsManager.isAdLoaded(this.rewardAd)) { this.adsManager.showAd(this.rewardAd); } else { AlertDialog.show({ message: '激励视频广告尚未加载完成', autoCancel: true }); } }
build() { Column() { // 页面标题 Text('鸿蒙广告SDK示例') .fontSize(24) .fontWeight(FontWeight.Bold) .margin({ top: 20, bottom: 10 }) // 广告状态显示 Text(this.adStatusText) .fontSize(16) .margin({ bottom: 20 }) // 广告控制按钮 Button('显示插屏广告') .onClick(() => this.showInterstitialAd()) .margin(10) Button('显示激励视频') .onClick(() => this.showRewardVideoAd()) .margin(10) // 注意事项 Text('注意:示例中的广告位ID为测试用,实际使用时需替换为真实广告位ID') .fontSize(12) .fontColor('#666666') .margin({ top: 30, left: 10, right: 10 }) } .width('100%') .height('100%') .backgroundColor('#F5F5F5') }}
复制代码


三、学习总结

上述代码使用 ArkTS 语言封装了鸿蒙广告 SDK,主要特点包括:

  1. 核心功能

    支持横幅、插屏、激励视频和开屏四种广告类型

    提供广告加载、展示、销毁等完整生命周期管理

    实现广告事件监听(加载成功 / 失败、展示、点击、关闭等)

    专门处理激励视频广告的奖励回调

  2. 设计模式

    使用单例模式管理广告服务实例

    通过接口定义统一的广告操作和回调

    模块化设计,分离广告管理逻辑与 UI 展示

  3. 使用示例

    提供了完整的页面示例,展示如何集成和使用 SDK

    包含广告加载、展示和资源释放的最佳实践


代码中有详细的注释, 具体可以参考相关代码注释,

四、参考

本文主要参考了鸿蒙官方文档广告服务相关的 API 说明,如有问题请大家指正, 优先参考官网说明哦

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ads-kit-guide

发布于: 11 分钟前阅读数: 4
用户头像

还未添加个人签名 2020-10-23 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙 Ads Kit(广告服务)开发指南:流量变现与广告接入实践_鸿蒙_哭着来笑着走天涯_InfoQ写作社区