华为HarmonyOS打造开放、合规的广告生态 - 原生广告

时间:2024-11-05 07:39:54
请求广告。

请求单广告位广告,需要创建一个AdLoader对象,通过AdLoader的loadAd方法请求广告,最后通过AdLoadListener,来监听广告的加载状态。

如果想要为用户更精准的推送广告,可以在请求参数AdRequestParams中添加oaid属性。

请求广告关键参数如下所示:

请求广告参数名

类型

必填

说明

adType

number

请求广告类型,原生广告类型为3。

adId

string

广告位ID。

  • 如果仅调测广告,可使用测试广告位ID:testy63txaom86(原生视频),testu7m3hc4gvm(原生大图),testb65czjivt9(原生小图),testr6w14o0hqz(原生三图)。
  • 如果要接入正式广告,则需要申请正式的广告位ID。可在应用发布前进入流量变现官网,点击“开始变现”,登录鲸鸿动能媒体服务平台进行申请,具体操作详情请参见展示位创建

oaid

string

开放匿名设备标识符,用于精准推送广告。不填无法获取到个性化广告。

示例代码如下所示:
 
  
  1. import { advertising, identifier } from '@kit.AdsKit';
  2. import { router } from '@kit.ArkUI';
  3. import { common } from '@kit.AbilityKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. import { BusinessError } from '@kit.BasicServicesKit';
  6. @Entry
  7. @Component
  8. export struct LoadAd {
  9. private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  10. private oaid: string = '';
  11. aboutToAppear() {
  12. try {
  13. // 使用Promise回调方式获取OAID
  14. identifier.getOAID().then((data: string) => {
  15. this.oaid = data;
  16. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in getting adsIdentifierInfo by promise');
  17. }).catch((error: BusinessError) => {
  18. hilog.error(0x0000, 'testTag', '%{public}s',
  19. `Failed to get adsIdentifierInfo, error code: ${error.code}, message: ${error.message}`);
  20. })
  21. } catch (error) {
  22. hilog.error(0x0000, 'testTag', '%{public}s', `Catch err, code: ${error.code}, message: ${error.message}`);
  23. }
  24. }
  25. build() {
  26. Column() {
  27. Column() {
  28. // 跳转到原生广告展示页面
  29. Button("请求原生广告", { type: ButtonType.Normal, stateEffect: true }).onClick(() => {
  30. this.requestAd();
  31. })
  32. }.width('100%').height('80%').justifyContent(FlexAlign.Center)
  33. }
  34. .width('100%')
  35. .height('100%')
  36. }
  37. private requestAd(): void {
  38. // 广告展示参数
  39. const adDisplayOptions: advertising.AdDisplayOptions = {
  40. // 是否静音,默认不静音
  41. mute: false
  42. }
  43. // 原生广告配置
  44. const adOptions: advertising.AdOptions = {
  45. // 设置是否请求非个性化广告
  46. nonPersonalizedAd: 1,
  47. // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
  48. allowMobileTraffic: 0,
  49. // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
  50. tagForChildProtection: -1,
  51. // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
  52. tagForUnderAgeOfPromise: -1,
  53. // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
  54. adContentClassification: 'A'
  55. }
  56. // 原生广告请求参数
  57. const nativeVideoAdReqParams: advertising.AdRequestParams = {
  58. // 'testu7m3hc4gvm'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  59. adId: 'testu7m3hc4gvm',
  60. adType: 3,
  61. adCount: 1,
  62. // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  63. enableDirectReturnVideoAd: true,
  64. oaid: this.oaid
  65. }
  66. // 广告请求回调监听
  67. const adLoaderListener: advertising.AdLoadListener = {
  68. // 广告请求失败回调
  69. onAdLoadFailure: (errorCode: number, errorMsg: string) => {
  70. hilog.error(0x0000, 'testTag', '%{public}s',
  71. `Failed to request ad, message: ${errorMsg}, error code: ${errorCode}`);
  72. },
  73. // 广告请求成功回调
  74. onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
  75. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in requesting ad');
  76. // 调用原生广告展示页面
  77. routePage('pages/NativeAdPage', ads, adDisplayOptions);
  78. }
  79. };
  80. // 创建AdLoader广告对象
  81. const load: advertising.AdLoader = new advertising.AdLoader(this.context);
  82. // 调用广告请求接口
  83. load.loadAd(nativeVideoAdReqParams, adOptions, adLoaderListener);
  84. }
  85. }
  86. async function routePage(pageUri: string, ads: Array<advertising.Advertisement | null>,
  87. displayOptions: advertising.AdDisplayOptions) {
  88. let options: router.RouterOptions = {
  89. url: pageUri,
  90. params: {
  91. ads: ads,
  92. displayOptions: displayOptions
  93. }
  94. }
  95. try {
  96. router.pushUrl(options);
  97. } catch (error) {
  98. hilog.error(0x0000, 'testTag', '%{public}s',
  99. `Failed to routePage callback, code: ${error.code}, msg: ${error.message}`);
  100. }
  101. }

请求多广告与请求单广告类似,需要创建一个AdLoader对象,通过AdLoader的loadAdWithMultiSlots方法请求广告,最后通过MultiSlotsAdLoadListener,来监听广告的加载状态。示例代码如下:
 
  
  1. import { advertising, identifier } from '@kit.AdsKit';
  2. import { router } from '@kit.ArkUI';
  3. import { common } from '@kit.AbilityKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. import { BusinessError } from '@kit.BasicServicesKit';
  6. @Entry
  7. @Component
  8. export struct LoadAd {
  9. private ads: Array<advertising.Advertisement> = [];
  10. private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  11. private oaid: string = '';
  12. aboutToAppear() {
  13. try {
  14. // 使用Promise回调方式获取OAID
  15. identifier.getOAID().then((data: string) => {
  16. this.oaid = data;
  17. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in getting adsIdentifierInfo by promise');
  18. }).catch((error: BusinessError) => {
  19. hilog.error(0x0000, 'testTag', '%{public}s',
  20. `Failed to get adsIdentifierInfo, code: ${error.code}, message: ${error.message}`);
  21. })
  22. } catch (error) {
  23. hilog.error(0x0000, 'testTag', '%{public}s', `Catch err, code: ${error.code}, message: ${error.message}`);
  24. }
  25. }
  26. build() {
  27. Column() {
  28. Column() {
  29. // 跳转到原生广告展示页面
  30. Button("请求原生广告", { type: ButtonType.Normal, stateEffect: true }).onClick(() => {
  31. this.requestAd();
  32. })
  33. }.width('100%').height('80%').justifyContent(FlexAlign.Center)
  34. }
  35. .width('100%')
  36. .height('100%')
  37. }
  38. private requestAd(): void {
  39. // 广告展示参数
  40. const adDisplayOptions: advertising.AdDisplayOptions = {
  41. // 是否静音,默认不静音
  42. mute: false
  43. }
  44. // 原生广告配置
  45. const adOptions: advertising.AdOptions = {
  46. // 是否允许流量下载 0不允许 1允许,不设置以广告主设置为准
  47. allowMobileTraffic: 0,
  48. // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
  49. tagForChildProtection: -1,
  50. // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
  51. tagForUnderAgeOfPromise: -1,
  52. // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
  53. adContentClassification: 'A'
  54. };
  55. // 原生广告请求参数
  56. const nativeVideoAdReqParams: advertising.AdRequestParams[] = [{
  57. // 'testy63txaom86'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  58. adId: 'testy63txaom86',
  59. adType: 3,
  60. adCount: 1,
  61. // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  62. enableDirectReturnVideoAd: true,
  63. oaid: this.oaid
  64. }, {
  65. // 'testu7m3hc4gvm'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  66. adId: 'testu7m3hc4gvm',
  67. adType: 3,
  68. adCount: 1,
  69. // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  70. enableDirectReturnVideoAd: true,
  71. oaid: this.oaid
  72. }]
  73. // 广告请求回调监听
  74. const adLoaderListener: advertising.MultiSlotsAdLoadListener = {
  75. // 广告请求失败回调
  76. onAdLoadFailure: (errorCode: number, errorMsg: string) => {
  77. hilog.error(0x0000, 'testTag', '%{public}s',
  78. `Failed to request ad errorCode is: ${errorCode}, errorMsg is: ${errorMsg}`);
  79. },
  80. // 广告请求成功回调
  81. onAdLoadSuccess: (ads: Map<string, Array<advertising.Advertisement>>) => {
  82. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in requesting ad!');
  83. ads.forEach((adsArray) => this.ads.push(...adsArray));
  84. // 调用原生广告展示页面
  85. routePage('pages/NativeAdPage', this.ads, adDisplayOptions);
  86. }
  87. };
  88. // 创建AdLoader广告对象
  89. const load: advertising.AdLoader = new advertising.AdLoader(this.context);
  90. // 调用广告请求接口
  91. load.loadAdWithMultiSlots(nativeVideoAdReqParams, adOptions, adLoaderListener);
  92. }
  93. }
  94. async function routePage(pageUri: string, ads: Array<advertising.Advertisement | null>,
  95. displayOptions: advertising.AdDisplayOptions) {
  96. let options: router.RouterOptions = {
  97. url: pageUri,
  98. params: {
  99. ads: ads,
  100. displayOptions: displayOptions
  101. }
  102. }
  103. try {
  104. router.pushUrl(options);
  105. } catch (error) {
  106. hilog.error(0x0000, 'testTag', '%{public}s',
  107. `Failed to routePage callback, code: ${error.code}, msg: ${error.message}`);
  108. }
  109. }