1. 广告请求服务的实现
首先,你需要创建一个广告请求服务来处理广告的加载和展示。你已经在代码中实现了 requestAd
函数,接下来需要处理广告加载、显示、点击等事件。可以考虑以下结构:
1.1 创建广告加载函数
import { advertising, identifier } from '@kit.AdsKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 请求广告的方法
function requestAd(context: common.Context, callback: (ads: Array<advertising.Advertisement>) => void): void {
const adRequestParam: advertising.AdRequestParams = {
adType: 1, // 广告类型
adId: 'testq6zq98hecj' // 测试广告位ID
};
const adOptions: advertising.AdOptions = {
allowMobileTraffic: 0,
tagForChildProtection: -1,
tagForUnderAgeOfPromise: -1,
adContentClassification: 'A'
};
const adLoaderListener: advertising.AdLoadListener = {
onAdLoadFailure: (errorCode: number, errorMsg: string) => {
hilog.error(0x0000, 'testTag', '%{public}s', `Request ad failed! ErrorCode: ${errorCode}, ErrorMsg: ${errorMsg}`);
},
onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
hilog.info(0x0000, 'testTag', '%{public}s', 'Request ad success!');
callback(ads); // 返回广告数据给调用方
}
};
const load: advertising.AdLoader = new advertising.AdLoader(context);
load.loadAd(adRequestParam, adOptions, adLoaderListener);
}
1.2 解释说明
- adRequestParam:广告请求参数,包括广告类型和广告位 ID。
- adOptions:广告的附加配置项,比如流量使用、广告内容分类等。
- adLoaderListener:广告加载监听器,用来处理广告请求成功与失败的回调。
onAdLoadFailure
:请求失败时的处理,记录错误日志。onAdLoadSuccess
:请求成功时的处理,执行回调返回广告数据。
1.3 使用广告加载函数
你可以在 aboutToAppear
或其他合适的生命周期函数中调用 requestAd
函数,获取广告数据并传递给广告组件进行显示。
@Entry
@Component
struct Start {
private ads: Array<advertising.Advertisement> = [];
private displayOptions?: advertising.AdDisplayOptions;
aboutToAppear(): void {
// 获取广告数据
requestAd(getContext(), (ads: Array<advertising.Advertisement>) => {
this.ads = ads; // 将广告数据赋值给组件
// 创建广告显示选项,定制广告展示的行为
this.displayOptions = {
// 可设置显示方式等
};
});
}
build() {
Column() {
// 确保广告已加载再显示广告组件
if (this.ads.length > 0) {
AdComponent({
ads: this.ads, // 传递广告数据
displayOptions: this.displayOptions,
interactionListener: {
onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
switch (status) {
case AdStatus.AD_OPEN:
hilog.info(0x0000, 'testTag', '%{public}s', '广告打开');
break;
case AdStatus.AD_CLICKED:
hilog.info(0x0000, 'testTag', '%{public}s', '广告点击');
break;
case AdStatus.AD_CLOSED:
hilog.info(0x0000, 'testTag', '%{public}s', '广告关闭');
break;
}
}
}
})
.width('100%')
.height('100%');
}
}
}
}
1.4 解释说明
requestAd(getContext(), ...)
:调用广告请求函数,获取广告数据并处理成功或失败回调。AdComponent
:用于展示广告的组件,传入广告数据和显示选项。interactionListener
:用于监听广告状态变化(打开、点击、关闭等),可以添加一些业务逻辑,比如广告点击后的跳转。
2. 广告错误处理和重试机制
在广告加载过程中,可能会发生一些网络错误或广告服务错误。在这种情况下,添加错误处理和重试机制是很重要的。
2.1 添加错误处理
在 onAdLoadFailure
回调中,可以根据错误代码做更细致的处理,比如网络错误时进行重试:
onAdLoadFailure: (errorCode: number, errorMsg: string) => {
hilog.error(0x0000, 'testTag', '%{public}s', `Request ad failed! ErrorCode: ${errorCode}, ErrorMsg: ${errorMsg}`);
// 根据错误码进行处理
if (errorCode === 21800001) {
hilog.error(0x0000, 'testTag', '%{public}s', '广告请求失败,可能是网络问题,进行重试');
// 可以在这里实现广告加载的重试逻辑
}
}
2.2 重试机制
可以设置一个简单的重试机制,尝试多次加载广告,直到成功为止:
function requestAdWithRetry(context: common.Context, callback: (ads: Array<advertising.Advertisement>) => void, retries: number = 3): void {
const tryRequest = (retriesLeft: number) => {
requestAd(context, (ads: Array<advertising.Advertisement>) => {
callback(ads);
});
if (retriesLeft > 0) {
setTimeout(() => {
tryRequest(retriesLeft - 1);
}, 2000); // 延迟2秒后重试
} else {
hilog.error(0x0000, 'testTag', '%{public}s', '广告加载失败,重试已达到最大次数');
}
};
tryRequest(retries);
}
2.3 解释说明
requestAdWithRetry
:这是一个带重试机制的广告请求函数。它会尝试加载广告,直到成功或达到最大重试次数。setTimeout
:延迟2秒后再重试一次广告加载。
3. 广告展示组件
广告展示组件是用于将加载的广告显示到界面上的。你可以使用 AdComponent
来展示广告,并通过 interactionListener
来监听广告的状态变化(打开、点击、关闭等)。
AdComponent({
ads: this.ads,
displayOptions: this.displayOptions,
interactionListener: {
onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
switch (status) {
case AdStatus.AD_OPEN:
hilog.info(0x0000, 'testTag', '%{public}s', '广告打开');
break;
case AdStatus.AD_CLICKED:
hilog.info(0x0000, 'testTag', '%{public}s', '广告点击');
break;
case AdStatus.AD_CLOSED:
hilog.info(0x0000, 'testTag', '%{public}s', '广告关闭');
break;
}
}
}
})
.width('100%')
.height('100%');
华为开屏广告集成笔记
1. 开屏广告概述
开屏广告是一种在应用启动时且在应用主界面显示之前展示的广告。它分为以下两种类型:
- 全屏开屏广告:广告覆盖整个屏幕。
- 半屏开屏广告:广告占据部分屏幕,并可自定义布局,通常会显示广告的图标和版权信息。
2. 开发步骤
开屏广告的集成分为以下几个主要步骤:
2.1 获取OAID
- OAID(Open Advertising ID)是设备的唯一广告标识符,用于精准推送广告。建议在请求广告时传递 OAID 以提升广告投放的精准度。
- 获取 OAID 示例代码:
identifier.getOAID().then((data: string) => {
this.oaid = data;
}).catch((error: BusinessError) => {
hilog.error(0x0000, 'testTag', 'Failed to get OAID');
});
2.2 请求广告
- 创建一个
AdLoader
对象来请求广告,并通过AdRequestParams
设置广告请求参数。 - 广告请求接口如下:
loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void
2.3 设置广告请求参数
adType
:广告类型(开屏广告类型为 1)。adId
:广告位ID。测试阶段使用提供的测试广告位ID(例如:testq6zq98hecj
半屏图片广告)。adCount
:广告数量。
示例:
private splashVideoAdReqParams: advertising.AdRequestParams = {
adId: 'testd7c5cewoj6', // 测试广告位ID
adType: AdType.SPLASH_AD,
adCount: 1,
oaid: this.oaid
};
2.4 加载广告并监听回调
通过
AdLoadListener
监听广告加载的回调:onAdLoadFailure
:广告加载失败。onAdLoadSuccess
:广告加载成功。
示例:
const adLoaderListener: advertising.AdLoadListener = {
onAdLoadFailure: (errorCode: number, errorMsg: string) => {
hilog.error(0x0000, 'testTag', `Failed to load ad. errorCode: ${errorCode}, errorMsg: ${errorMsg}`);
},
onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
hilog.info(0x0000, 'testTag', 'Ad loaded successfully!');
// 展示广告
}
};
2.5 设置广告展示
AdComponent
组件用于展示广告,配置广告展示参数并监听广告交互状态。
示例:
AdComponent({
ads: this.ads,
displayOptions: this.displayOptions,
interactionListener: {
onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
switch (status) {
case AdStatus.AD_OPEN:
hilog.info(0x0000, 'testTag', 'Ad opened');
break;
case AdStatus.AD_CLICKED:
hilog.info(0x0000, 'testTag', 'Ad clicked');
break;
case AdStatus.AD_CLOSED:
hilog.info(0x0000, 'testTag', 'Ad closed');
break;
}
}
}
});
3. 广告展示页面
- 全屏广告展示页面
@Component
export struct SplashFullScreenAdPage {
private ads: Array<advertising.Advertisement> = [];
private displayOptions?: advertising.AdDisplayOptions;
aboutToAppear() {
const params: Record<string, Object> = router.getParams() as Record<string, Object>;
if (params && params.ads as Array<advertising.Advertisement>) {
this.ads = params.ads as Array<advertising.Advertisement>;
}
}
build() {
Column() {
AdComponent({
ads: this.ads,
displayOptions: this.displayOptions,
interactionListener: { ... }
})
.width('100%')
.height('100%');
}
}
}
- 半屏广告展示页面
@Component
export struct SplashHalfScreenAdPage {
private ads: Array<advertising.Advertisement> = [];
private displayOptions?: advertising.AdDisplayOptions;
aboutToAppear() {
const params: Record<string, Object> = router.getParams() as Record<string, Object>;
if (params && params.ads as Array<advertising.Advertisement>) {
this.ads = params.ads as Array<advertising.Advertisement>;
}
}
build() {
Column() {
AdComponent({
ads: this.ads,
displayOptions: this.displayOptions,
interactionListener: { ... }
})
.width('100%')
.height('87%');
}
}
}
4. 超时处理
- 在请求广告时设置超时,如果超过一定时间未加载广告,则跳转到默认首页。
示例:
private timeOutHandler(): void {
this.isTimeOut = false;
this.timeOutIndex = setTimeout(() => {
this.isTimeOut = true;
router.pushUrl({
url: 'pages/Index', // 超时后跳转的页面
});
hilog.error(0x0000, 'testTag', 'Ad load timeout');
}, this.timeOutDuration);
}
5. 总结
- 请求开屏广告时,必须提供广告位 ID、广告类型和 OAID。
- 通过
AdLoader
请求广告,并通过AdLoadListener
监听广告加载回调。 - 通过
AdComponent
展示广告,并根据广告状态进行交互操作(如打开、点击、关闭)。 - 开屏广告的展示类型(全屏或半屏)可通过广告返回的
isFullScreen
属性判断。 - 在请求广告时,要处理超时情况,防止应用在等待广告时卡死。
4. 总结
- 广告请求:通过
AdLoader
请求广告并处理回调。 - 广告显示:使用
AdComponent
组件展示广告数据,并通过interactionListener
监听广告状态。 - 错误处理与重试机制:在广告加载失败时添加错误处理,并实现重试机制以增强稳定性。
这样,就能实现一个完整的广告服务,包括广告的请求、加载、展示、状态监听和错误处理。