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', // 测试广告位IDadType: 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
监听广告状态。 - 错误处理与重试机制:在广告加载失败时添加错误处理,并实现重试机制以增强稳定性。
这样,就能实现一个完整的广告服务,包括广告的请求、加载、展示、状态监听和错误处理。