鸿蒙 Ads Kit(广告服务)开发指南:流量变现与广告接入实践
- 2025-05-26 北京
本文字数:8768 字
阅读完需:约 29 分钟

一、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
@Component
struct 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,主要特点包括:
核心功能:
支持横幅、插屏、激励视频和开屏四种广告类型
提供广告加载、展示、销毁等完整生命周期管理
实现广告事件监听(加载成功 / 失败、展示、点击、关闭等)
专门处理激励视频广告的奖励回调
设计模式:
使用单例模式管理广告服务实例
通过接口定义统一的广告操作和回调
模块化设计,分离广告管理逻辑与 UI 展示
使用示例:
提供了完整的页面示例,展示如何集成和使用 SDK
包含广告加载、展示和资源释放的最佳实践
代码中有详细的注释, 具体可以参考相关代码注释,
四、参考
本文主要参考了鸿蒙官方文档广告服务相关的 API 说明,如有问题请大家指正, 优先参考官网说明哦
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ads-kit-guide
版权声明: 本文为 InfoQ 作者【哭着来笑着走天涯】的原创文章。
原文链接:【http://xie.infoq.cn/article/c525638268268590222fb1a43】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。

哭着来笑着走天涯
还未添加个人签名 2020-10-23 加入
还未添加个人简介
评论