鸿蒙Next原生广告展示白屏
鸿蒙Next原生广告展示白屏
我在进行原生广告的多广告请求的时,广告展示偶尔白屏,使用的是AdComponent
组件
测试广告位id为 testu7m3hc4gvm
测试广告位id为 testb65czjivt9
我的请求方法及内容如下
export function requestMultiAds(context: common.UIAbilityContext, adParams: advertising.AdRequestParams[], callback?: AdReqCallback) {
let TAG: string = 'requestMultiAds'
// 广告配置
let adOptions: advertising.AdOptions = {
// 设置是否请求非个性化广告
nonPersonalizedAd: 0,
// 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
allowMobileTraffic: 0,
// 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
tagForChildProtection: -1,
// 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
tagForUnderAgeOfPromise: -1,
// 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
adContentClassification: 'A'
}
// 广告展示参数
let displayOptions: advertising.AdDisplayOptions = {
// 是否静音,默认不静音
mute: false
}
try {
// 广告请求回调监听
const adLoaderListener: advertising.MultiSlotsAdLoadListener = {
// 广告请求失败回调
onAdLoadFailure: (errorCode: number, errorMsg: string) => {
LogUtils.wtf(TAG, `Failed to request ad errorCode is: ${errorCode}, errorMsg is: ${errorMsg}`)
callback?.adFailure(errorCode, errorMsg)
},
// 广告请求成功回调
onAdLoadSuccess: (ads: Map<string, Array<advertising.Advertisement>>) => {
LogUtils.wtf(TAG, 'Succeeded in requesting ad!')
// 调用原生广告展示页面
callback?.adMultiSucc(ads, displayOptions)
}
};
// 创建AdLoader广告对象
const load: advertising.AdLoader = new advertising.AdLoader(context);
// 调用广告请求接口
load.loadAdWithMultiSlots(adParams, adOptions, adLoaderListener);
} catch (err) {
}
}
当我调用的时候内容如下
private native24Hours: Array<advertising.Advertisement> | undefined = [];
private nativeLifeIndex: Array<advertising.Advertisement> | undefined = [];
async requestAd() {
let adParams: advertising.AdRequestParams[] = []
// 开关控制
let slotHours = await SwitchCacheManager.getInstance().isSwitchOpen(
SwitchParams.SLOT_MAIN_AD_CENTER_NEW_BANNER)
if (slotHours) adParams.push(PARAMS_NATIVE_FIRST_24HOUR)
let slotLife = await SwitchCacheManager.getInstance().isSwitchOpen(
SwitchParams.SLOT_MAIN_AD_BOTTOM)
if (slotLife) adParams.push(PARAMS_NATIVE_LIFEINDEX)
if (adParams.length == 0) {
return
}
console.log('adParams.length+++++',JSON.stringify(adParams.length))
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext
let callBack: AdReqCallback = {
adSuccess: (ads: advertising.Advertisement[],
options?: advertising.AdDisplayOptions | undefined): void => {
},
adFailure: (errorCode: number, errorMsg: string): void => {
return
},
adMultiSucc: (mapAds: Map<string, advertising.Advertisement[]>,
options?: advertising.AdDisplayOptions | undefined): void => {
this.native24Hours = mapAds.get(SlotConst.SLOT_NATIVE_FIRST_24HOUR)
this.nativeLifeIndex = mapAds.get(SlotConst.SLOT_NATIVE_LIFEINDEX)
console.log('adMultiSucc++++',JSON.stringify(this.native24Hours))
console.log('++++adMultiSucc++++1',JSON.stringify(this.nativeLifeIndex),JSON.stringify(options))
this.options = options
}
}
requestMultiAds(context, adParams, callBack)
}
上面的日志如下
adMultiSucc++++ [{ "adType":3,"uniqueId":"95dedd83-c95f-4891-9d46-bd347e66a430","isFullScreen":false,"rewardVerifyConfig":{},"rewarded":false,"shown":false,"clicked":false,"suggestedCompHeight":120,"minEffectiveShowRatio":50}]
++++adMultiSucc++++1 [{ "adType":3,"uniqueId":"","isFullScreen":false,"rewardVerifyConfig":{},"rewarded":false,"shown":false,"clicked":false,"suggestedCompHeight":265,"minEffectiveShowRatio":50}] {"mute":false}
调用广告的组件方法如下
ListItem() {
First_LifeIndexAD({ ads: this.nativeLifeIndex, options: this.options })
}
@Component
export struct First_LifeIndexAD {
@State showAd: boolean = true
private ads: Array<advertising.Advertisement> = []
private options?: advertising.AdDisplayOptions
isShowNative() {
return (this.ads && this.ads.length > 0 && this.showAd)
}
build() {
Column() {
AdComponent({ ads: this.ads, displayOptions: this.options,
interactionListener: {
onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
switch(status) {
case AdStatus.AD_OPEN:
LogUtils.d(TAG, `onAdOpen`);
break;
case AdStatus.AD_CLICKED:
LogUtils.d(TAG, `onAdClick`);
break;
case AdStatus.AD_CLOSED:
LogUtils.d(TAG, `onAdClose`);
this.showAd = false
break;
}
}}})
.width('95%')
}
.width('95%')
.height(265)
.borderRadius(12)
.margin({left:8,right:8})
.backgroundColor(Color.White)
.justifyContent(FlexAlign.Center)
.visibility(this.isShowNative()?Visibility.Visible:Visibility.None)
}
}
更多关于鸿蒙Next原生广告展示白屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
鸿蒙Next原生广告展示白屏问题可能涉及以下几个方面:
-
资源加载问题:广告资源未正确加载或加载失败,导致页面无法渲染。检查资源路径、网络请求状态及资源文件完整性。
-
渲染引擎问题:鸿蒙系统渲染引擎在特定情况下可能无法正确渲染广告内容。确保使用的渲染引擎版本与鸿蒙系统兼容。
-
权限配置:广告展示可能涉及某些系统权限,如网络权限、存储权限等,未正确配置可能导致白屏。检查应用的权限配置是否符合要求。
-
API调用错误:广告展示接口调用不当或参数错误可能导致白屏。检查广告展示API的调用方式及传递的参数是否正确。
-
系统兼容性:鸿蒙Next系统版本与广告SDK版本可能存在兼容性问题。确认使用的广告SDK版本支持当前鸿蒙系统版本。
-
缓存问题:缓存机制可能导致广告内容无法及时更新,出现白屏。尝试清除缓存或重新加载广告内容。
-
日志分析:通过系统日志或广告SDK提供的日志工具,分析白屏问题的具体原因,定位问题所在。
以上是可能导致鸿蒙Next原生广告展示白屏的几个常见原因,具体问题需根据实际情况进一步排查。